以异步方式运行两个任务并等到它们结束的最快方法

时间:2010-12-09 19:12:47

标签: c# silverlight

好的,我需要改变这个......

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 个答案:

答案 0 :(得分:10)

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()仅在两个线程终止后才返回。

答案 1 :(得分:7)

Task task1 = Task.Factory.StartNew( () => {DoSomething(1,0);});
Task task2 = Task.Factory.StartNew( () => {DoSomething(2,3);});
Task.WaitAll(task1,task2);

您需要将Microsoft Async包(及其依赖项)添加到您的silverlight项目中。

答案 2 :(得分:3)

尽管像Silverlight中没有像Ralph的回答所提到的TPL,但我真的很喜欢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上,将系统中的线程限制在合理的数量。