此代码导致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();
}
答案 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));