Запуск нескольких C # Task Async - PullRequest
       18

Запуск нескольких C # Task Async

9 голосов
/ 21 сентября 2010

Привет, обычно я делаю это с Background Worker, но вместо этого я хотел бы сделать это с C # Task, просто чтобы лучше понять Task.

Дело в том, что у меня есть класс со следующими свойствами

    private int _number1;
    public int Number1
    {
        get { return _number1; }
        set { _number1 = value; OnPropertyChanged("Number1");}
    }

    private int _number2;
    public int Number2
    {
        get { return _number2; }
        set { _number2 = value; OnPropertyChanged("Number2");}
    }

Обратите внимание, что я использую INotifyPropertyChanged.

Number1 = Task<int>.Factory.StartNew(() => GenerateResult()).Result;
Number2 = Task<int>.Factory.StartNew(() => GenerateResult2()).Result;

GenerateResult и GenerateResult2 - просто фиктивные методы, которые спят, а затем возвращают число.

Какя сделал бы эту работу Async?Поскольку прямо сейчас GenerateResult2 () вызывается первым, когда завершается GenerateResult ().

Мне нужно, чтобы он мог работать в асинхронном режиме, поскольку я понятия не имею, когда каждая задача завершится или даже завершится.

Ответы [ 3 ]

13 голосов
/ 21 сентября 2010

Когда вы получаете свойство Result, вы фактически ожидаете завершения задачи. Он будет выполняться в фоновом потоке, но вы ожидаете завершения в основном потоке, прежде чем начинать следующий поток.

Подробнее см. MSDN doc .

Вы должны иметь возможность просто назначить свои свойства из фонового потока:

Task<int>.Factory.StartNew(() => Number1 = GenerateResult());

Привязка данных WPF позаботится о маршалинге Событие PropertyChanged в правильный поток диспетчера.

3 голосов
/ 21 сентября 2010

Я проверил это: Параллелизм задач (Task Parallel Library) и в нем говорится, что при использовании System.Threading.Tasks.Task<TResult> Задачи выполняются асинхронно и могут выполняться в любом порядке. Если к Result обращаются до завершения вычисления, свойство блокирует поток до тех пор, пока значение не станет доступным.

Я думаю, это означает, что если вы обращаетесь к .Result до того, как оно получит значение, как вы делаете в своем примере кода, вам придется подождать, пока оно завершится первым.

Это имеет смысл, поскольку свойство Result не будет заполнено до тех пор, пока задача не будет завершена.

0 голосов
/ 21 сентября 2010
Task<int>.Factory.StartNew(() => GenerateResult2()).ContinueWith(() => GenerateResult());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...