C# Thread.join()阻塞主线程直到完成
这个问题与我从这个问题中收到的一些评论有关: 我有以下代码:C# Thread.join()阻塞主线程直到完成,c#,multithreading,C#,Multithreading,这个问题与我从这个问题中收到的一些评论有关: 我有以下代码: myObject object1 = null; Thread obj1Thread = new Thread(() => { object1 = _myService.GetMethod(variable1, variable2); }); obj1Thread.Start(); obj1Thread.Join(); myObject object2 = null; Thread obj2Thread = new Thr
myObject object1 = null;
Thread obj1Thread = new Thread(() => { object1 = _myService.GetMethod(variable1, variable2); });
obj1Thread.Start();
obj1Thread.Join();
myObject object2 = null;
Thread obj2Thread = new Thread(() => { object2 = _myService.GetMethod2(variable3, variable4); });
obj2Thread.Start();
obj2Thread.Join();
我对该准则的理解如下:
这段代码将创建2个新线程,并发运行指定的方法,暂停主线程,直到这两个线程都完成,然后继续执行
但是,根据上面问题中的一些注释,下面的代码obj1Thread.Join()代码>将不会执行,直到obj1Thread
完成
有人能确认这是否正确吗
如果是这样,这基本上意味着代码根本不是多线程的,而是按顺序运行的
2进一步的要点/问题
-如何使这段代码同时运行,并且在主线程继续之前在指定点等待所有线程完成
-我运行了10次此方法,使用.join()平均快了0.5秒-如果代码基本上是按顺序运行的,为什么我会看到性能提高?您应该在另一个位置为每个线程调用join()
:
myObject object1 = null;
Thread obj1Thread = new Thread(() => { object1 = _myService.GetMethod(variable1, variable2); });
obj1Thread.Start();
myObject object2 = null;
Thread obj2Thread = new Thread(() => { object2 = _myService.GetMethod2(variable3, variable4); });
obj2Thread.Start();
obj1Thread.Join();
obj2Thread.Join();
在这种情况下,将启动两个线程,然后您才应该等待它们。您应该在另一个位置为每个线程调用Join()
:
myObject object1 = null;
Thread obj1Thread = new Thread(() => { object1 = _myService.GetMethod(variable1, variable2); });
obj1Thread.Start();
myObject object2 = null;
Thread obj2Thread = new Thread(() => { object2 = _myService.GetMethod2(variable3, variable4); });
obj2Thread.Start();
obj1Thread.Join();
obj2Thread.Join();
在这种情况下,将启动两个线程,然后您才应该等待它们。对Join()
的调用将阻止当前线程,这意味着在第一次调用GetMethod
完成之前,您的第二个线程既没有创建也没有启动
从.NET Framework 4.0开始,建议并行执行两个操作的方法是使用
您可以使用Parallel.Invoke
方法:
myObject object1 = null;
myObject object2 = null;
Parallel.Invoke(
() => object1 = _myService.GetMethod(variable1, variable2),
() => object2 = _myService.GetMethod2(variable3, variable4)
);
myObject object1 = null;
myObject object2 = null;
Task t1 = Task.Run(() => object1 = _myService.GetMethod(variable1, variable2));
Task t2 = Task.Run(() => object2 = _myService.GetMethod(variable3, variable4));
await Task.WhenAll(t1, t2);
它接受任意数量的操作并执行它们,可能是并行的。所有操作完成后,该方法返回
如果要等待并行操作异步完成,可以启动两个单独的任务并使用任务等待它们。whalll
方法:
myObject object1 = null;
myObject object2 = null;
Parallel.Invoke(
() => object1 = _myService.GetMethod(variable1, variable2),
() => object2 = _myService.GetMethod2(variable3, variable4)
);
myObject object1 = null;
myObject object2 = null;
Task t1 = Task.Run(() => object1 = _myService.GetMethod(variable1, variable2));
Task t2 = Task.Run(() => object2 = _myService.GetMethod(variable3, variable4));
await Task.WhenAll(t1, t2);
调用Join()
会阻止当前线程,这意味着在第一次调用GetMethod
完成之前,不会创建或启动第二个线程
从.NET Framework 4.0开始,建议并行执行两个操作的方法是使用
您可以使用Parallel.Invoke
方法:
myObject object1 = null;
myObject object2 = null;
Parallel.Invoke(
() => object1 = _myService.GetMethod(variable1, variable2),
() => object2 = _myService.GetMethod2(variable3, variable4)
);
myObject object1 = null;
myObject object2 = null;
Task t1 = Task.Run(() => object1 = _myService.GetMethod(variable1, variable2));
Task t2 = Task.Run(() => object2 = _myService.GetMethod(variable3, variable4));
await Task.WhenAll(t1, t2);
它接受任意数量的操作并执行它们,可能是并行的。所有操作完成后,该方法返回
如果要等待并行操作异步完成,可以启动两个单独的任务并使用任务等待它们。whalll
方法:
myObject object1 = null;
myObject object2 = null;
Parallel.Invoke(
() => object1 = _myService.GetMethod(variable1, variable2),
() => object2 = _myService.GetMethod2(variable3, variable4)
);
myObject object1 = null;
myObject object2 = null;
Task t1 = Task.Run(() => object1 = _myService.GetMethod(variable1, variable2));
Task t2 = Task.Run(() => object2 = _myService.GetMethod(variable3, variable4));
await Task.WhenAll(t1, t2);
没有必要提出新问题。只需更新您的旧问题,在编辑中处理注释即可。“根据上述问题中的一些注释,obj1Thread.Join();下面的代码在obj1Thread完成之前不会执行”-错误。相反,在第一个线程连接被解锁之前,您将无法创建第二个线程,从而使创建线程的整个想法变得糟糕。与同步运行服务方法相比,它的性能甚至更低(由于必须创建线程的开销)。通常,您会先创建并启动几个作业,然后以某种方式(Task.whalll
是可能的)等待它们完成。如果是,这基本上意味着代码根本不是多线程的,而是并发运行。
它确实是多线程的。主螺纹和OBJ10螺纹<代码>连接()
等待线程完成。这是正常的行为。在上面发布的代码中没有“暂停主线程,直到两个线程都完成”的内容。见msdn。阅读示例代码中的绿色注释:不需要新问题。只需更新您的旧问题,在编辑中处理注释即可。“根据上述问题中的一些注释,obj1Thread.Join();下面的代码在obj1Thread完成之前不会执行”-错误。相反,在第一个线程连接被解锁之前,您将无法创建第二个线程,从而使创建线程的整个想法变得糟糕。与同步运行服务方法相比,它的性能甚至更低(由于必须创建线程的开销)。通常,您会先创建并启动几个作业,然后以某种方式(Task.whalll
是可能的)等待它们完成。如果是,这基本上意味着代码根本不是多线程的,而是并发运行。
它确实是多线程的。主螺纹和OBJ10螺纹<代码>连接()等待线程完成。这是正常的行为。在上面发布的代码中没有“暂停主线程,直到两个线程都完成”的内容。见msdn。阅读示例代码中的绿色注释: