2009-06-24 8 views
1

私が制御しないいくつかのWebサービスメソッドを呼び出すとします。このメソッドは実行に時間がかかり、Webサービスを開発した人は非同期バージョンを含むとは考えていませんでした。C#/ WinformsでWebサービスメソッドを非同期にする

C#/ winformsでこのようなメソッドの非同期ラッパーを作成する最も良い方法は何ですか?

現時点では、私はThreadPoolを使用してWebサービスメソッドを実行してから、Webサービスが終了したときにイベントを呼び出します。このようなもの。

DoWorkAsync() { 
    Webservice.LongMethod() 
    WorkCompleteEvent() 
} 

ただし、これは理想的ではありません。たとえば、イベントハンドラからフォームコントロールを変更しようとすると、別のスレッドなどからその操作を行わない旨の警告が表示されます。

他にこの問題を解決する方法はありますか?

答えて

6

MSDN記事How to: Make Thread-Safe Calls to Windows Forms Controls &も参照してください。Jon Skeetの偉大なguide to threadingより具体的にはThreading in Windows Formsを参照してください。

引用ジョン(強調鉱山):

起動BeginInvokeをEndInvokeを又はcreateGraphicsの以外の別のスレッドで作成された制御上の任意のメソッドまたはプロパティを呼び出すことはありません、そしてInvokeRequired。 各コントロールは、メッセージポンプを実行するスレッドに効果的にバインドされます。 UIで何かにアクセスしようとすると(例えばTextプロパティを変更するなど)、別のスレッドから変更しようとすると、プログラムがぶら下がったり、別の方法で不正行為をする危険性があります。場合によっては、盲目的にしか運ばれない場合があります。 幸いにも、Invokeメソッド、BeginInvokeメソッド、EndInvokeメソッドが提供されているため、メソッドを安全に呼び出すようにUIスレッドに依頼することができます。

0

非同期代理人を使用してWebメソッドを呼び出すことができます。 どうすればいいのかは、Asynchronous File Copy/Move in C#をご覧ください。 FILECOPYは、あなたのWebメソッドで考えてみましょう(例えばのようにではなく、クラスメソッド。)

あなたはcrossthread operations error

1

を参照することができ、クロススレッド・エラーのためのソリューションは、Webサービスへの非同期ソリューションに組み込まれた使用することです。 webservice.BeginLongMethod()を使用して、IAsyncResultを呼び出して使用します。しかし、それは別のスレッド上にあるので、Windowsフォームコードを更新するために常にInvokeメソッドを使用する必要があることに注意してください。

次の記事

http://www.informit.com/articles/article.aspx?p=29395&seqNum=4

http://msdn.microsoft.com/en-us/library/ms228972.aspx

を参照してください。
関連する問題