2013-03-22 2 views
1

У меня есть функция, которая обрабатывает несколько HTTP-запросов и запускается в задаче. эта функция может быть прервана посередине, так как я не могу отменить задачу, я добавил некоторые логические условия в функцию. пример:Отмена функции

public int foo(ref bool cancel) 
{ 
    if(cancel) 
    { 
     return null 
    } 
    //do some work... 
    if(cancel) 
    { 
     return null 
    } 
    //http webrequest 
    if(cancel) 
    { 
     return null 
    } 
} 

thisworked довольно хорошо, хотя это совсем немного некрасиво код.

Другая проблема в том, что я уже выполнил веб-запрос, и мне требуется время, чтобы получить ответ, чем функция cncelation занимает много времени (пока я не получу ответ).

есть ли лучший способ проверить это? или mybe я должен использовать потоки вместо задачи?

редактировать

я добавил от отказа фишку: объявлен cancelationTokenSource, и передал его фишку к задаче

CancellationTokenSource cncelToken = new CancellationTokenSource(); 
Task t = new Task(() => {foo()},cancelToken.token); 

когда я делаю cancelToken.Cancel(); Я все еще жду ответа, и tsk не отменяет.

ответ

1

Отказ от поддержки задач - см. here.

Это быстрый фрагмент.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var token = new CancellationTokenSource(); 
     var t = Task.Factory.StartNew(
      o => 
      { 
       while (true) 
        Console.WriteLine("{0}: Processing", DateTime.Now); 
      }, token); 

     token.CancelAfter(1000); 
     t.Wait(token.Token); 
    } 
} 

Не забудьте дождаться задания, используя предоставленный токен отмены. Вы должны получить исключение OperationCanceledException.

+2

Какой чудесный полный и хорошо объясненный ответ! – RMalke

+0

, но его симулятор к моему решению. только thins заключается в том, что моя задача вызывает функцию, и эта функция не знает токена отмены. я все равно должен проверить, требуется ли отмена. я могу использовать токен cncelation, но мне все равно придется ждать ответа, чтобы вернуться. Я хочу отменить его до этого. – alostr

+0

Не совсем - необходимость опроса на токене отмены - только если у вас есть очистка для выполнения. Если нет никакой очистки, задача будет молча прекратить выполнение вашего кода. – Ani

Смежные вопросы