0

我有一个奇怪的 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 类的代码不会从不同的地方同时调用。

我可能会考虑:“好的,此应用程序的问题已解决”。但这并没有解决我的问题。我必须明白。

4

0 回答 0