【发布时间】:2015-02-17 02:21:08
【问题描述】:
我有以下:
[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 的错误。通常,如果proxyDrivers 之一遇到这种情况,它们都会立即发生。我需要防止motherDriver 被多次重生,所以我尝试使用布尔值isPaused 和while 循环来管理它。在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,有时使用isPaused。 -
HandleIntro(proxyDriver, target)方法不包括在内 - 同样只需要一个参数。 -
@SebastianNegraszus - 这是一个错字。我试图简化代码,所以请原谅任何小的不一致
-
@Kami 这是一个错字。我试图简化代码,所以请原谅任何小的不一致
-
顺便说一句 - 您知道在循环中调用
var rnd = new Random();会导致使用相同的种子,因此您的调用var r = rnd.Next(itemArray.Count);可以产生相同的值吗?您确实需要在类级别实例化一次rnd。
标签: c# asp.net asynchronous async-await