我已经搜索了很多问题和答案,但仍然无法解决问题。
CancellationTokenSource对我不起作用,因为任何cancellationtokensource 方法都会在异步方法中结束异步请求。不是从外面。
让我扩展我想告诉你的内容;
我有一个Hammock REST 方法,它可以异步地为 Twitter流式传输任何如下推文:
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 类型的异步 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));
}));
我曾尝试中止线程,但没有办法,这个 beginrequest 是在另一个我不在其中的线程中处理的。
无法使用 EndRequest 方法,因为它会引发错误。
提前致谢