C# 告诉“其他”任务在C中暂停

C# 告诉“其他”任务在C中暂停,c#,asp.net,asynchronous,async-await,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.N

我有以下资料:

[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);
}
但是编译器告诉我,while\u isPaused in FixProblem始终是真的——好像它没有看到该值将在某个时刻由另一个线程设置。这说明我走错了方向。这是正确的方法吗?如何正确处理此问题?

将volatile关键字添加到_isPaused字段可能会解决此问题,但我建议使用带锁的正确同步。

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

您需要同步对restart motherDriver控制块的访问,以确保只有一个线程可以重新启动进程。尝试以下方法:

private static object objectlock = new object();

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

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

您的代码不完整或有输入错误:有时使用“isPaused”,有时使用“isPaused”。HandleIntroProProxyDriver,target方法不包括在内-相同的方法只接受一个参数。@SebastianNegraszus-这是一个输入错误。我试图简化代码,所以请原谅任何小错误inconsistencies@Kami这是个打字错误。我试图简化代码,以便原谅任何小的不一致,只是作为旁注-您知道调用var rnd=new Random;在一个循环中,可以使用相同的种子,因此调用var r=rnd.NextitemArray.Count;那么能产生同样的价值吗?您确实需要在类级别实例化rnd一次。谢谢。当其他任务试图访问修复问题时会发生什么?我需要它们保持活动状态,直到修复问题完成。@到达lock语句的第一个线程将阻止所有其他线程,直到它完成-。我在示例代码中添加了对MotherDrivernedStobereStarted的检查-这将是一种方法或类似的方法,用于检查是否需要重新启动motherDriver以防止重复重新启动。
private static object objectlock = new object();

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