我有一个函数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>
答案 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);
}
});