什么是现代C#方式启动两个线程然后等待它们结束?

Aar*_*ide 2 c# multithreading

你会如何使用C#中最新的线程技术重写它?

var dateRange = new DateRange(date, date.AddDays(1));
var extracter = new ConversionsExtracter(dateRange, AdvertiserId);
var loader = new ConversionsLoader();
var extracterThread = extracter.Start();
var loaderThread = loader.Start(extracter);
extracterThread.Join();
loaderThread.Join();
Run Code Online (Sandbox Code Playgroud)

loader和extract对象都有一个Start方法:

public  Thread Start()
{
    var thread = new Thread(Extract);
    thread.Start();
    return thread;
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*hel 11

有任务:

var t1 = Task.Factory.StartNew(() => extracter.Start(), TaskCreationOptions.LongRunning);
var t2 = Task.Factory.StartNew(() => loader.Start(), TaskCreationOptions.LongRunning);

// some arbitrary amount of code here that's executed on the main thread.

// Wait for both threads to complete before continuing.
t1.Wait();
t2.Wait();

// Code here cannot execute until the loader and extractor are finished.
Run Code Online (Sandbox Code Playgroud)

任务有许多功能,使它们比明确管理线程更容易使用,包括支持取消,延续等.值得研究.

  • @PieterGeerkens:是的,主线程阻塞,直到两个线程完成.它与OP显示的行为完全相同,只是使用`Task`.我假设他通过消除主线程在这两个线程正在做的事情时所做的处理来简化事情.在第一次调用"Wait"之前可能会发生任何数量的事情,但是主线程必须确保其他线程在继续之前完成.也许我的编辑给你一个更好的主意? (2认同)
  • 我更喜欢`Task.WhenAll(t1,t2).Wait()`,如果`t1`抛出,它将允许从任务的_both_中捕获异常.由于仅创建一个同步对象而不是两个同步对象,因此它也可能更便宜. (2认同)
  • 如果你无论如何都要阻止,我会说`Task.WaitAll(t1,t2)`.此外,您应该使用`Task.Run`或显式将调度程序传递给`StartNew`. (2认同)