c# - 在 C# 中告诉 "other"任务暂停

标签 c# asp.net asynchronous async-await

我有以下内容:

[TestMethod]
public async Task Start() 
{
   var numDrivers = 2;
   List<Task> tasks = new List<Task>();
   var motherDriver = GetMotherDriver();
   while (numDrivers != 0) 
   {
       var rnd = new Random();
       var r = rnd.Next(itemArray.Count);

       var target = itemArray[r];
       var proxyDriver = GetProxiedDriver();

       tasks.Add(Task.Run(() => HandleIntro(proxyDriver)));
       numDrivers--;
   }

   await Task.WhenAll(tasks);
}

这是有效的,但每隔一段时间,HandleIntro 就会遇到一个错误,需要重置 motherDriver。通常,如果其中一个 proxyDriver 遇到这种情况,所有代理驱动程序都会立即发生。我需要防止 motherDriver 多次重生,因此我尝试使用 bool isPausedwhile 循环来管理此问题。在 HandleIntro 中,我尝试使用第一个任务设置的全局变量来告诉其他任务暂停,直到完成:

 private bool _isPaused;

 private async Task Start(){ 
   _isPaused = false;
   //code
 }

 private async Task HandleIntro(Driver driver) {
       // wait for isPaused to get set to false
       while(_isPaused){}
       // do stuff
       if(errorOccurs){
           FixProblem();
       }
 }

 private void FixProblem(){
         if (!_isPaused){
             _isPaused = true;
             // spawn new motherDriver
             _isPaused = false;
         } else{
             // hold here until other thread sets isPaused = false
             while (_isPaused){}
          }  
 }

但是编译器告诉我,FixProblem 中的 while (_isPaused) 始终为 true - 就好像它没有看到这一点一样该值将由另一个线程在某个时刻设置。这告诉我我正在以错误的方式处理这件事。这是正确的方法吗?如何正确处理?

最佳答案

您正在各个任务之间共享 _isPaused 变量。因此,当一项任务改变变量的值时;所有线程都进入新的motherDriver初始化过程。

您需要同步访问重启motherDriver控制 block ,以确保只有一个线程可以重启进程。尝试类似的方法:

private static object objectlock = new object();

private void FixProblem(){
   lock(objectlock)
   {
      if (!_isPaused && motherDriverNeedsTobeRestarted){
         _isPaused = true;
         // spawn new motherDriver
         _isPaused = false;
      }
   }
}

这将确保在出现问题时,motherDriver 在任务关闭之前重新启动。

关于c# - 在 C# 中告诉 "other"任务暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28539885/

相关文章:

c# - 按最后一次出现的字符拆分字符串的最佳方法?

c# - ReSharper 提示我应该在 WebForms 中执行静态方法 - 为什么?我错过了什么吗?

asp.net - 如何将 HttpHandler 添加到 web.config 中?

c# - 如何在不同的 CPU 内核上生成线程?

c# - IRequiresSessionState - 我该如何使用它?

asynchronous - 从 C# 异步方法返回多个值

javascript - setInterval 回调中 undefined variable

javascript - 等待异步任务完成

c# - Azure 函数从表中读取

asp.net - 错误 : String or binary data would be truncated. 语句已终止