Предопределенная задача много раз возвращает асинхронный вызов - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть задача, определенная в начале моего класса, как это:

Task<string> MainTask {get;set;}

И затем внутри приложения я создаю эту задачу.

MainTask = new Task<string>( () => 
{
    return Task.Run<string>( async () => 
    {
        await GetResult();

    }).Result;
});

Я хочу сделатьцикл, пока задача не вернет данные, но как только задача завершится в первый раз, я не могу запустить ее снова.

bool gotResult = false;
While(gotResult == false)
{
  MainTask.Start();
  MainTask.Wait();
  if(MainTask.Result)
  {
    gotResult = true;
  }
}

1 Ответ

0 голосов
/ 18 декабря 2018

MainTask не должно быть Task, оно должно быть Func<Task> (или, в этом случае, поскольку асинхронная операция, по-видимому, предоставляет логическое значение Func<Task<bool>>, позволяющее запустить асинхронныйоперации в любое время, просто вызвав метод.

Так определите его как:

Func<Task<bool>> AsyncOperation {get;set;}

Используйте его как:

while(!await AsyncOperation())
{
    //do nothing
}

Что касается его назначения, выпросто нужно назначить асинхронный метод, который у вас есть:

AsyncOperation = GetResult;

Обратите внимание, что вы действительно не должны использовать конструктор Task каждый раз. Не работайте с незапущенными задачами, это только приводит к путанице.нет необходимости использовать Task.Run для вызова асинхронного метода. Это уже асинхронный . Также нет необходимости использовать асинхронную лямбду для вызова асинхронного метода, обе эти вещи просто добавляют накладные расходы и не добавляют значения.

...