WCF サービスを Windows サービスとして実装しようとしています。数秒間実行される可能性のあるメソッドがいくつかあるため、非同期で呼び出したいと思います。以下雑多。チュートリアル ( MSDNなど) は、実際には機能していないように見えました。少しは動いていますが、サービスからクライアントに返されるデータが期待どおりではありません。サーバー上のサービスのコード例は次のとおりです。
public interface ISomeService
{
[OperationContract(AsyncPattern = true)]
IAsnycResult BeginSomeMethod(string someString);
Collection<string> EndSomeMethod(IAsnycResult asyncresult);
}
[...]
public SomeService : ISomeService
{
public IAsyncResult BeginSomeMethod(AsyncCallback callback, object state)
{
// Do something...
Collection collection = new Collection<string>{"Some Item", "Another Item"};
return new CompletedAsyncResult<Collection<string>>(collection);
}
public Collection<string> EndSomeMethod(IAsyncResult asyncResult)
{
CompletedAsyncResult<Collection<string>> result =
asyncResult as CompletedAsyncResult<Collection<string>>;
if(result != null)
{
return result.Data;
}
return result;
}
}
Windows サービスを正常にインストールし、ブラウザ経由で呼び出して WSDL を表示することもできます。「クライアント」プロジェクトへの参照を追加して、それを使用することもできます。プロキシ クラスなどはエラーなしで生成されます。次のようにメソッドを呼び出すこともできます。
[...]
object async = new object();
someService.BeginSomeMethod( "Some string", EndSomeMethod, async );
[...]
コールバック メソッドは次のようになります。
[...]
public static void EndSomeMethod( IAsyncResult asyncResult )
CompletedAsnycResult<Collection<string>> result =
asyncResult as CompletedAsnycResult<Collection<string>>;
[...]
これに続いて、result は null (つまり、キャストが成功しなかった) であり、asyncResult にはいくつかのプロパティとデータが含まれていますが、予期された (または必要な) 文字列コレクションではありません。
編集 サービスメソッドが本来の目的を果たしていることを確認できます(たとえば、ログファイルへの書き込み、ファイルの作成など)。 /編集
さらにいくつかのアプローチを試しましたが、ここで何が間違っているのかについて少し混乱しています。Microsoft から入手できる例は明らかに正しくありません (一部の MSDN ページで読んでいるように)。他にもイベントハンドラーなどの提案をいくつか見つけましたが、今のところそれが最善の方法でしたか?
OperationContract 属性で AsyncPattern = true を使用してサービス メソッドを実際に装飾する必要がありますか? または、VS2010 の機能を使用して、メソッドを非同期的に呼び出すメソッドを生成できますか?
この問題に関して多くの質問があることは承知していますが、この問題に何時間も費やした後、私はかなり立ち往生しているように感じます.