2011-01-28 2 views
1

編集: クライアントソリューションをデバッグモードで使用すると、すべてが意図どおりに機能することに注意してください。サービスを持つソリューションは、デバッグモードの中または外で正常に動作します。その後、非同期マルチスレッドクライアントメソッドをWCFサービスが終了するのを待ってから実行を続行する


私は、サーバーにユーザーがアップロードした.zipファイルを保存し、ファイルアップローダーに取り組んでいる、それを解凍、そこから異なる場所の束にコピーし、それを(Webサービスを使用)、およびアップロードされた.zipファイルと解凍されたファイルが削除されます。

ので:

1)アップロードしたファイル

2を解凍)がQueueUserWorkItem(メソッド名)を使用し、 "ありがとう" ページ

3)メソッド名(にユーザーをリダイレクトします)は、解凍されたフォルダを他の場所にコピーするWCF Webサービスコールを2つ作成します。サービスコールが完了していないと、ファイルはもはや必要では一度

string copyToPaths = UploaderService.StartFolderUpload(_fileCategoryName, topDir); 
UploaderService.CompleteFolderUpload(copyToPaths); 

4)は、ここで問題(古いファイルを削除します)

だから私の問題は、WCFサービスを呼び出す方法は待たないということです完了したことを知らせる前にサービスコールを完了し、ファイルを削除します。アップロードされたファイルを削除すると、Webサービスはそれらのファイルを他の場所にコピーすることはできません。

QueueUserWorkItemで呼び出されたメソッドをWebサービス呼び出しが終了するのを待ってから実行を続行するにはどうすればよいですか?

+1

問題に関連して質問タイトルを更新する必要があります。あなたのタグを使ってあなたの技術などを教えてください – James

+0

あなたの投稿はファイルの削除が 'QueueUserWorkItem(MethodName)'の下の行で行われることを示唆しています。 'QueueUserWorkItem'がすぐに戻るので、これはうまくいきません。それらはMethodNameの最後にあるはずです。 –

+0

いいえ - 削除は、QueueUserWorkItem(MethodName)呼び出しの後ではなく、MethodName()メソッドの最後で行われます。 – Buchannon

答えて

1

私の知る限り、この動作はクライアント側とは関係ありません。これは、サービスメソッドのOperationContract属性によって制御されます。

[OperationContract(IsOneWay = true)] 
void CompleteFolderUpload(string copyToPaths); 

これは2番目のサービス方法の外観ですか?そうであれば、このメソッドが完了するまでクライアントが待機するようにするには、IsOneWayをfalseに設定する(または単に削除する)必要があります。 IsOneWay = trueは、クライアントがサーバーからの応答を期待しないようにするため、メソッドが完了する前にほとんど常に返されることを意味します。

+0

私はこれをすべてのサービスメソッドに追加しようとしましたが、私はまだ同じ問題を抱えています。 – Buchannon

+0

あなたは何を追加しましたか? "IsOneWay"パラメータがない場合、これは "IsOneWay = false"と同等です。これは必要なものです。サービス操作が正しくマークされている場合、おそらくサービスメソッド自体は非同期です。たとえば、ワーカースレッド上で実行するように作業をキューイングしてすぐに戻ることができます。あなたはサービスコードを制御しますか? –

+0

ええ、サービスとクライアントコードの両方を制御しています。私は具体的には、サービスが継承するインターフェイスの各メソッドに[OperationContract(IsOneWay = false)]を追加しました。 – Buchannon

0

WCFサービスをDuplex serviceにすることを検討してください。こうすることで、クライアントでコールバックを指定して、サービスがいつ終了したかを知ることができます。また、クライアントにデータを渡すこともできます。エラー情報など

関連する問題