Самый быстрый способ выполнить две задачи асинхронно и дождаться их завершения - PullRequest
5 голосов
/ 09 декабря 2010

Хорошо, мне нужно изменить это ..

void foo()
{
    DoSomething(1, 0);
    DoSomething(2, 3);
}

примерно так ...

void foo()
{
    //this functions is sync.. I need to run them async somehow
    new Thread(DoSomething(1, 0));
    new Thread(DoSomething(2, 3));

    //Now I need to wait until both async functions will end
    WaitUntilBothFunctionsWillEnd();
}

Есть ли способ сделать это в Silverlight?

Ответы [ 3 ]

10 голосов
/ 09 декабря 2010
void foo()
{
    var thread1 = new Thread(() => DoSomething(1, 0));
    var thread2 = new Thread(() => DoSomething(2, 3));

    thread1.Start();
    thread2.Start();

    thread1.Join();
    thread2.Join();
}

Метод Thread.Join() будет блокировать выполнение до тех пор, пока поток не прекратит работу, поэтому объединение обоих потоков обеспечит возврат foo() только после завершения обоих потоков.

7 голосов
/ 09 декабря 2010
Task task1 = Task.Factory.StartNew( () => {DoSomething(1,0);});
Task task2 = Task.Factory.StartNew( () => {DoSomething(2,3);});
Task.WaitAll(task1,task2);

Вам необходимо добавить пакет Microsoft Async (и его зависимые элементы) в ваш проект silverlight.

3 голосов
/ 09 декабря 2010

Несмотря на то, что TPL , подобный предложенному Ральфом ответу, недоступен в Silverlight, мне действительно нравится модель Task ... Так почему бы не написать тонкую оболочку для потоков, которая будет работать аналогично.

using System;
using System.Threading;
using System.Linq;

public class Task {
    ManualResetEvent _mre = new ManualResetEvent(false);

    public Task(Action action) {
        ThreadPool.QueueUserWorkItem((s) => {
            action();
            _mre.Set();
        });
    }

    public static void WaitAll(params Task[] tasks) {
        WaitHandle.WaitAll(tasks.Select(t => t._mre).ToArray());
    }
}

Тогда вы можете использовать это как TPL:

int param1 = 1;
int param2 = 2;
Task.WaitAll(
    new Task( () => DoSomething(param1, param2) ),
    new Task( () => DoSomething(param1, param2) )
);

Под покровом это возлагает на ThreadPool ответственность за ограничение потоков в системе до разумного количества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...