Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使异步代码可取消_C#_.net_Multithreading - Fatal编程技术网

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();
      }
   }
}