Завершить асинхронный запрос начала извне
Я уже искал много вопросов и ответов, но все еще не смог решить проблему.
CancellationTokenSource не работает для меня, потому что любой метод cancellationtokensource завершает асинхронный запрос в рамках асинхронного метода. Не снаружи.
Позвольте мне расширить то, что я хочу вам сказать;
У меня есть метод 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.(На самом деле этот вызов срабатывает только при получении твита)
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));
}));
Я попытался прервать поток, но ни в коем случае этот запрос не обрабатывается в другом потоке, которого я не имею в нем.
Не удалось использовать метод EndRequest, потому что он выдает ошибку.
заранее спасибо