Silverlight异步apis会导致挂起和无响应

时间:2010-02-03 15:46:49

标签: silverlight synchronization webclient silverlight-3.0

此代码导致silverlight挂起。如果我删除了ManualResetEvent代码,则没有任何反应

        private ManualResetEvent mre = new ManualResetEvent(false);

        ...

        WebClient sender = new WebClient();
        sender. += new OpenReadCompletedEventHandler(this.ReadComplete);
        sender.OpenReadAsync(new Uri(this.url+"?blob="+BODY, UriKind.Relative));

        mre.WaitOne();

    }
    public bool T = false;
    public void ReadComplete(object sender, OpenReadCompletedEventArgs e)
    {

        mre.Set();
    }

2 个答案:

答案 0 :(得分:2)

您无法阻止UI线程(参见“mre.WaitOne”)。如果您绝对需要WaitOne,则必须在单独的线程中运行代码。这可以按如下方式完成:

var t = new Thread(delegate()
{
    //...
    mre.WaitOne();
    //...
});

可以预期回调中的“mre.Set()”将被触发。但是,我遇到了同样的问题,显然,OpenReadAsync回调机制使用UI线程作为中间调度程序。调度不会发生等待事件设置。

答案 1 :(得分:0)

我只能看到几个可能导致您认为需要阻止等待的原因。要么您不知道您应该在完整的事件中继续您的代码,要么您还有其他本地状态,而您没有包含在ReadCompleted过程无法访问的示例代码中。

以下是处理下载流的一些样板代码: -

string dummy = "Some value"; // local value you still need to access when download complete

WebClient wc = new WebClient();
wc.OpenReadCompleted += (s, args)
{
   if (!args.Cancelled)
   {
     try
     {
         Stream stream = args.Stream;  // This is the data you are after
         // Do stuff with stream, note the dummy variable is still accessible here.
     }
     catch (Exception err)
     {
         //Do something sensible with the exception to make sure its surfaced
     }
   }
};
sender.OpenReadAsync(new Uri(this.url+"?blob="+BODY, UriKind.Relative));