我有一个奇怪的 AutoResetEvent 行为
Utils 类中有代码:
class Utils
{
public static AutoResetEvent FileDownloaded = new AutoResetEvent(false);
public static void DownloadFileAsync(string sourceUrl, string toPath)
{
var webClient = new WebClient();
var url = new Uri(sourceUrl);
FileDownloaded.Reset();
webClient.DownloadStringCompleted += (s, e) =>
{
Debug.WriteLine("DownloadStringAsinc completed");
if(e.Error != null || string.IsNullOrEmpty( e.Result))
{
//do retries
}
else
{
FileDownloaded.Set();
}
};
webClient.DownloadStringAsync(url);
}
}
并且在收听时有代码:
public DoSomeWork()
{
Utils.DownloadFileAsync(iniUrl, localIni);
if(Utils.FileDownloaded.WaitOne(2222))
{
//....
}
else
//it goes here at initial run
}
它是这样调用的:
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (object o, DoWorkEventArgs args) =>
{
DoSomeWork();
}
bw.RunWorkerAsync();
在这种情况下,第一次调用 WaitOne 时,它会立即返回 false(就像超时一样)。第二次没问题,调试输出中甚至没有“DownloadStringAsinc 完成”。当我从主线程调用 Utils.FileDownloaded.WaitOne(2222) 时(我知道这是不对的,只是在测试)它按预期工作。但是当我将块移动到线程时,出现了这种行为。另外,如果我在稍后块中的“if”语句之前创建 Thread.Sleep(200),一切正常
必须添加:来自 Utils 类的代码不会从不同的地方同时调用。
我可能会考虑:“好的,此应用程序的问题已解决”。但这并没有解决我的问题。我必须明白。