在长时间运行的 C# 方法中,我想在几秒钟后引发异常或引发事件。
这可能吗?
您可以使用计时器来执行此操作 - 将其设置为您希望的超时并在方法开始时启动它。
在方法的最后,禁用计时器——它只会在超时时触发,您可以连接到滴答事件。
var timer = new Timer(timeout);
timer.Elapsed = ElapsedEventHanler; // Name of the event handler
timer.Start();
// do long running process
timer.Stop();
我建议阅读不同的计时器类——这会让你知道它们中的哪一个最适合你的特定需求。
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
}
}
如果您打算停止长时间运行的方法,那么我认为向该方法添加取消支持将是一种更好的方法,而不是引发异常。
尝试以下操作,它具有取消异常的功能(如果进程完成)并在源线程上引发异常:
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();