6

重複の可能性:
Silverlight 4 を使用したこの同期呼び出しで、ManualResetEvent が機能しないのはなぜですか?

MainPage.Xaml.cs に以下のコードがあります

 ManualResetEvent wait = new ManualResetEvent(false);
 Service1Client wcf = new Service1Client();
 wcf.DoWorkCompleted += (o, ev) =>
 {
   int s = (int)ev.Result;
   wait.Set();
 };
 wcf.DoWorkAsync();
 wait.WaitOne();

//My other part of code where I'd like the value of `int s`.
....

Service1.svc.cs には次のコードがあります。

public class Service1 : IService1
{
  public int DoWork()
  {
    return 5;
  }
}

完了するまでDoWorkコードを待機させたいので、このコードを作成しました。ただし、命令の後WaitOne(Service1.svc.cs) メソッドDoWork()はまったく呼び出されません。アプリケーションはそこにとどまり、何もしません。以前、SilverLight 4 の別のマシンでこれに取り組んだことがありますが、期待どおりに機能していました。現在、SilverLight 3 を使用しています。

4

1 に答える 1

0

を呼び出して、UI スレッドでデッドロックを引き起こしている可能性がありますwait.WaitOne()

DoWorkCompleted非同期操作が完了すると、UI ディスパッチャーを介してを呼び出そうとします。呼び出しは正常にキューに入れられますが、UI スレッドが でブロックされているため、キューから取り出されることはありませんWaitOne()

私の意見では、この回避策は避けて、非同期呼び出しだけを行うべきです。

于 2012-10-24T09:02:33.920 に答える