すでに多くの質問と回答を検索しましたが、まだ問題を解決できていません。
CancellationTokenSourceが機能しません。任意の canceltokensource メソッドが async メソッド内で async リクエストを終了するためです。外からではありません。
言いたいことを拡張させてください。
以下のようなツイートに対して Twitter を非同期にストリーミングするHammock REST メソッドがあります。
IAsyncResult asyncServ = service.StreamFilter((streamEvent, response) =>
{
if (streamEvent == null && response != null && response.StatusCode != 0)
{
string logDesc = String.Format("Failed to Stream {0}:{1}", obj.Keyword, response.Response);
methods.CreateLog(ClassLibrary.LogType.Error, ClassLibrary.LogSource.TweetKeywordStreamService, logDesc, null);
}
else if (response == null || streamEvent == null)
{
methods.CreateLog(ClassLibrary.LogType.Error, ClassLibrary.LogSource.TweetKeywordStreamService, "Failed to Stream: " + obj.Keyword, null);
}
else if (response.StatusCode == 0)
{
Task objSaver = new Task(() =>
{
SaveStreamTweet(streamEvent, obj.Id, obj.Keyword);
});
objSaver.Start();
}
else
{
methods.CreateLog(ClassLibrary.LogType.Error, ClassLibrary.LogSource.TweetKeywordStreamService, "Possibly failed to Stream: " + obj.Keyword, null);
}
}, obj.Keyword, obj.Follow);
このメソッドは、ツイートが受信された場合にのみトリガーされます。そのため、Stream Filter メソッド内でキャンセル トークンを使用する場合、ツイートがトリガーされるのを待つ必要があり、その後コード ブロックが機能します。
このサービスをStream Filter コード ブロックの外側で終了したいと考えています。
StreamFilterメソッドがどのように機能するかを次に示します。これは、IAsyncResult 型の async beginrequest を作成して返します (実際には、これはツイートが受信された場合にのみトリガーされます)。
return client.BeginRequest(request, new RestCallback<T>((req, resp, state) =>
{
Exception exception;
var entity = TryAsyncResponse(() =>
{
SetResponse(resp);
JsonSerializer serializer = new JsonSerializer();
var retEntity = serializer.Deserialize<T>(resp);
return retEntity;
},
out exception);
action(entity, new TwitterResponse(resp, exception));
}));
私は Thread を中止しようとしましたが、方法はありません。この beginrequest は、私がその中にいない別のスレッドで処理されます。
エラーがスローされるため、EndRequest メソッドを使用できませんでした。
前もって感謝します