在 C# 中,是否可以启动后台操作、终止它并获取其堆栈跟踪?



在我的C#应用程序(实际上是单元测试(中,我希望能够启动操作并设置超时。如果超时已过,并且我的操作尚未终止,我想:

  1. 引发异常。
  2. 包括运行操作的线程的堆栈跟踪。
  3. 如果合理方便,请取消操作。

我可以使用劳伦斯·约翰斯顿(Lawrence Johnston(在回答中描述的方法完成#1点:https://stackoverflow.com/a/22078975/8557153

如何完成第 2 点?我有一个对任务的引用,但我知道任务对象本身没有堆栈跟踪。任务只是某种数据结构。只有线程具有堆栈跟踪。但是有没有办法从运行任务的线程中获取堆栈跟踪(如果有的话(?还是我需要完全重写我的任务主体才能做到这一点?

第 3 点是可选的。让任务在后台继续不等待是可以接受的,但最好中止它。

使用取消令牌。它将做您想要的所有 3 件事:

  1. 当任务被取消时,他们会抛出一个TaskCancelledException
  2. 异常将具有堆栈跟踪。
  3. 该任务将被取消。

您可以在此处阅读有关它的信息,但这里有一个简单的示例:

var tokenSource = new CancellationTokenSource();
//start a task
var task = Task.Delay(TimeSpan.FromMinutes(1), tokenSource.Token);
//cancel the task
tokenSource.Cancel();
try {
//once you await it, you will see the exception
await task;
} catch (TaskCanceledException e) {
//inspect e.StackTrace
}

相关内容

  • 没有找到相关文章

最新更新