什么';这是一种现代的C#方法,先启动两个线程,然后等待它们结束
本文关键字:启动 两个 线程 结束 等待 然后 方法 什么 一种 | 更新日期: 2023-09-27 18:24:55
如何使用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();
加载器和提取对象都有一个Start
方法:
public Thread Start()
{
var thread = new Thread(Extract);
thread.Start();
return thread;
}
带任务:
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.
任务有许多特性,这些特性使它们比显式管理线程更容易使用,包括支持取消、继续等。非常值得研究。
使用此定义的方法:
async Task<TResult> RunLoadAsync(/* args */) {
var dateRange = new DateRange(date, date.AddDays(1));
var extracter = new ConversionsExtracter(dateRange, AdvertiserId);
var loader = new ConversionsLoader();
var intermediate = await Task.Factory.StartNew(
() => extracter.Start(), TaskCreationOptions.LongRunning
);
return await Task.Factory.StartNew(
() => loader.Start(intermediate), TaskCreationOptions.LongRunning
);
}
这样调用它:
var result = await RunLoadAsync(/* parameters */);
更新:下面是一个更完整的用法示例:
private async void PanelBoard_MouseCtlClick(object sender, HexEventArgs e) {
GoalHex = e.Coords;
// other processing to prepare.
try { Path = await MapBoard.GetDirectedPathAsync(MapBoard[StartHex], MapBoard[GoalHex]); }
catch (OperationCanceledException) { Path = default(IDirectedPath); }
}
public static async Task<IDirectedPath> GetDirectedPathAsync(
this IBoard<IHex> @this,
IHex start, IHex goal
) {
if (@this == null) throw new ArgumentNullException("this");
return @this.GetDirectedPath(start, goal);
}
IDirectedPath Path {
set { /* code here to refresh display when Path is ready */ }
}
public static Task<IDirectedPath> GetDirectedPathAsync(
this IBoard<IHex> @this,
IHex start, IHex goal
) {
if (@this == null) throw new ArgumentNullException("this");
return Task.Run<IDirectedPath>(
() => @this.GetDirectedPath(start, goal)
);
}
方法GetDirectedPathAsync()上的async限定符使其成为await的对象。