在非UI线程上调用AsyncWaitHandle.WaitOne时出现NotSupportedException

时间:2013-10-29 14:29:02

标签: c# multithreading silverlight httpwebrequest

我尝试等待HttpWebRequest完成而不写十几个AsyncCallbacks。为此,我尝试在任务中处理调用并在其中使用WaitOne - >所以ui线程不会被阻止。

现在的问题是,每次调用它时都会出现NotSupportedException,我不明白为什么。有人可以告诉我更多关于这个问题,也许可以解决这个问题吗?

这里是代码:

    Task.Factory.StartNew((x)=>
            {


            HttpWebRequest request = WebRequest.CreateHttp(baseUri + "/api/" + ControllerName);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.Headers["Session"] = SessionKey;

            IAsyncResult GetRequestStreamResult = request.BeginGetRequestStream(null, null);
            GetRequestStreamResult.AsyncWaitHandle.WaitOne(); //<-- That causes the exception
            using (Stream RequestStream = request.EndGetRequestStream(GetRequestStreamResult))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(Parameter.GetType());
                serializer.WriteObject(RequestStream, Parameter);
            }

祝你好运

了Christoph

2 个答案:

答案 0 :(得分:2)

我发现了article。这向我指出了可能不是常见的Silverlight问题的方向,而是IAsyncResult的实际实现的问题,该问题是System.Net.Browser.OHWRAsyncResult。在访问AsyncWaitHandle getter时,这会在任何情况下抛出NotSupportedException。

我通过编写这个小的扩展方法来帮助我:

    private static void WaitForIt(this IAsyncResult result)
    {
        while (!result.IsCompleted)
        {
            Thread.Sleep(50);
        }
    }

不是很漂亮,但它有效...

此致

了Christoph

答案 1 :(得分:0)

使用此处理程序...

  while ((GetRequestStreamResult.AsyncWaitHandle.WaitOne(1000, true) == false)
          && (GetRequestStreamResult.IsCompleted == false))
           {
               // Do nothing 
           }