从外部终止异步开始请求

时间:2016-03-31 14:24:55

标签: c# asynchronous twitter request hammock

我已经搜索了很多问题和答案,但仍然无法解决问题。

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方法中使用取消令牌,我需要等待推文触发,然后我的代码块才能正常工作。

我想结束此服务之外的流过滤器代码块。

以下是 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));
        }));

我试过中止Thread,但没有办法,这个beginrequest是在另一个我不在其中的线程中处理的。

无法使用EndRequest方法,因为它会抛出错误。

提前致谢

0 个答案:

没有答案