C#异步函数线程

时间:2016-03-07 23:47:42

标签: c# multithreading

测试

我有一个函数f1(字符串,字符串),需要4秒才能执行(与它的作用无关)。通过在main中调用f1(“a”,“b”)来测试它。

致电

Console.WriteLine(f1("a", "b")); 
Console.WriteLine(f1("a", "b")); 

将等待4秒钟以完成第一个功能,提示返回,等待另外4秒,提示第二个结果都很好并且花花公子。

我尝试通过使用lambda创建两个单独的匿名线程来并行执行此操作:

new Thread(() => {Console.WriteLine(f1("a", "b")); }).Start();
new Thread(() => {Console.WriteLine(f1("a", "b")); }).Start();

由于我有一个双核处理器并且功能处理繁重(操作系统平衡得非常好)我在4秒后(而不是8)得到了两个提示,所以我知道它并行工作。

问题

我怎么能写一个函数f1Async(string,string),它最初会调用f1(string,string),虽然每次都在不同的线程上(就像我在main中手动完成的那样)?为了知道f1Async的输出是什么,我必须等待线程完成,因此连续两次调用f1Async()将导致函数等待一个线程完成,然后再继续第二次调用。 / p>

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找Parallel.For。它将并行运行多个动作迭代,并等待所有迭代完成。

如果您希望在继续之前异步运行f1两次:

Parallel.For(0, 2, i => Console.WriteLine(f1("a", "b")));

请记住,异步数据输出可能会导致数据混乱。您应该lock Console.WriteLine用于线程安全:

object synchro = new object();
Parallel.For(0, 2, i =>
{
    var output = f1("a", "b");
    lock (synchro)
    {
        Console.WriteLine(output);
    }
});