1

在长时间运行的 C# 方法中,我想在几秒钟后引发异常或引发事件。

这可能吗?

4

4 回答 4

2

您可以使用计时器来执行此操作 - 将其设置为您希望的超时并在方法开始时启动它。

在方法的最后,禁用计时器——它只会在超时时触发,您可以连接到滴答事件。

var timer = new Timer(timeout);
timer.Elapsed = ElapsedEventHanler; // Name of the event handler
timer.Start();

// do long running process

timer.Stop();

我建议阅读不同的计时器类——这会让你知道它们中的哪一个最适合你的特定需求。

于 2012-10-12T09:13:32.633 回答
0

Use System.Threading.Timer:

System.Threading.Timer t;
int seconds = 0;

public void start() {

    TimerCallback tcb = new TimerCallback(tick);
    t = new System.Threading.Timer(tcb);
    t.Change(0, 1000);          
}

public void tick(object o)
{
    seconds++;
    if (seconds == 60)
    {
        // do something
    }
}
于 2012-10-12T09:15:48.727 回答
0

如果您打算停止长时间运行的方法,那么我认为向该方法添加取消支持将是一种更好的方法,而不是引发异常。

于 2012-10-12T09:20:04.937 回答
0

尝试以下操作,它具有取消异常的功能(如果进程完成)并在源线程上引发异常:

var targetThreadDispatcher = Dispatcher.CurrentDispatcher;
var tokenSource = new CancellationTokenSource();
var cancellationToken = tokenSource.Token;
Task.Factory.StartNew(() => 
{
    var ct = cancellationToken;

    // How long the process has to run
    Task.Delay(TimeSpan.FromSeconds(5));

    // Exit the thread if the process completed
    ct.ThrowIfCancellationRequest();

    // Throw exception to target thread
    targetThreadDispatcher.Invoke(() => 
    {
        throw new MyExceptionClass();
    }
}, cancellationToken);

RunProcess();

// Cancel the exception raising if the process was completed.
tokenSource.Cancel();
于 2012-10-12T09:26:00.663 回答