用AutoResetEvent之类的线程同步。

解决方案 »

  1.   

    每个线程一个循环,每次循环判断一个 event 是否被设置,设置了,就终止循环
      

  2.   

    var b=Task.WaitAny(task1,task2)var res=await b这代码是等待第一个任务完成,至于后续任务虽然继续执行,但忽略返回task1这个可以是 task<int> mytask(list<int> list)
    {
        await Task.Yield();    var tcs = new TaskCompletionSource<bool>();    Task.Run(() =>
        {
             foreach(var item in list)
             {
                if(check(item))  //check方法就是你去检查的代码,这个你直接完成
              {
                 tcs.SetResult(item); //检查成功异步返回
                  }
             }
        });    tcs.Task.Wait(); //同步等待完成 ,这里其实也可以直接返回tcs.task
    }当然这只是其中一种简便的完成方式。其实也还有利用 CancelTokenSource 的控制,任何一个优先完成后,直接把CancelTokenSource Cancel掉就行。或者采用信号量控制也是ok的
      

  3.   

    TaskCompletionSource 本身其实也是异步信号量手段
      

  4.   


    谢谢你的回复  
    这个办法是行不通的~   比如说A 线程 进行了设置   但是B线程可能在你设置之间就进入了!  A完成后  B也会执行的  
      

  5.   


    谢谢你的回复  
    这个办法是行不通的~   比如说A 线程 进行了设置   但是B线程可能在你设置之间就进入了!  A完成后  B也会执行的  
    行不通的~   A 进行设置时  可能B已经进入了  你这设置是无效的既然是写多线程应用,那么怎么就不知道访问公共资源是需要加锁的呢?
    仅凭自己的臆想,就否定别人合理的建议,这绝不是科学的治学态度
      

  6.   


    谢谢你的回复  
    这个办法是行不通的~   比如说A 线程 进行了设置   但是B线程可能在你设置之间就进入了!  A完成后  B也会执行的  
    行不通的~   A 进行设置时  可能B已经进入了  你这设置是无效的既然是写多线程应用,那么怎么就不知道访问公共资源是需要加锁的呢?
    仅凭自己的臆想,就否定别人合理的建议,这绝不是科学的治学态度谢谢你的回复   加锁的话效率要慢的多!   每生成一个码要请求一下进行验证   这样解出的机率很小了。
      

  7.   


    谢谢回复   线程同步我试了也不行! 速度太慢了谢谢回复  我现在试着用task同步看看能不能解决~