C# 使异步代码可取消
我有一些耗时的方法:C# 使异步代码可取消,c#,.net,multithreading,C#,.net,Multithreading,我有一些耗时的方法: public class TimeConsumingClass { public void TimeConsumingMethod() { //let's imagine my method works this way for (var i = 0; i < 10000; i++) Thread.Sleep(); } } 现在我需要让它随时停止这个方法。所以我想让我的方法以某种方式处理Cancellati
public class TimeConsumingClass
{
public void TimeConsumingMethod()
{
//let's imagine my method works this way
for (var i = 0; i < 10000; i++)
Thread.Sleep();
}
}
现在我需要让它随时停止这个方法。所以我想让我的方法以某种方式处理CancellationToken,同时我想保持同步调用这个方法的可能性(没有CancellationToken)。我想到的最好办法是将可选的CancellationToken参数添加到我的方法中,该参数默认为null(对于同步调用):
公共类TimeConsumingClass
{
public void TimeConsumingMethod(CancellationToken CancellationToken=null)
{
//让我们想象一下我的方法是这样工作的
对于(变量i=0;i<10000;i++)
{
if(cancellationToken.IsCancellationRequested)
返回;
Thread.Sleep();
}
}
}
但是最近.NET多线程技术有了很多创新,我觉得这是一种更好的方法来完成我要做的事情。有吗?如果你正在寻找一种更“现代”的方法来做这件事,你最好的办法是研究新的
async
和wait
c#关键字。到目前为止,它们是实现异步性最直接的方法
您可以在这里找到有关async
和wait
的详细介绍:
使用Async和Await(C#和Visual Basic)进行异步编程要了解如何报告进度和取消异步方法,请阅读此处: 4.5中的异步:在异步API中启用进度和取消 要取消与您在问题中使用的代码样式相同的任务,请查看此处: 任务取消
在不知道线程实际代表的工作负载的情况下。Sleep这是一个最佳解决方案。您的问题涉及使异步代码可取消。。。但在我看来,这完全是同步的。你能澄清一下吗?@JonSkeet,我所说的异步是指我的代码是在非主代码中执行的thread@spender,是否有可能改变答案的工作负载详细信息?我可以提供一些:)在上的示例中看起来就是这样做的
Task.Factory.StartNew(() => { new TimeConsumingClass().TimeConsumingMethod(); });
public class TimeConsumingClass
{
public void TimeConsumingMethod(CancellationToken cancellationToken = null)
{
//let's imagine my method works this way
for (var i = 0; i < 10000; i++)
{
if (cancellationToken.IsCancellationRequested)
return;
Thread.Sleep();
}
}
}