在C#中,根据应用程序的类型和需求,可以选择不同的方式来启动任务(Task)。这些启动方式主要通过System.Threading.Tasks.Task
类或System.Threading.Tasks.Task<TResult>
类来实现,适用于执行异步操作。
Task的启动方式一共有4种。
t1
通过调用 Task 类构造函数进行实例化,但仅在任务t2
启动后调用其Start()方法启动。t2
通过调用 TaskFactory.StartNew(Action, Object) 方法在单个方法调用中实例化和启动。
t3
通过调用 Run(Action) 方法在单个方法调用中实例化和启动。t4
通过调用 RunSynchronously() 方法在主线程上同步执行。调用Start方法
首先创建一个Task
的实例,然后调用它的Start
方法来启动任务。这种方式相比Task.Run
和Task.Factory.StartNew
较少使用,因为它需要两步来启动任务,而上述方法只需要一步。
C#private void btnRun_Click(object sender, EventArgs e)
{
var t = new Task(() =>
{
this.BeginInvoke(() =>
{
txtStatus.AppendText("Task RUN...\r\n");
});
Task.Delay(1000);
});
t.Start();
Task.WaitAll(t);//等待所有任务结束,这是在UI是会卡住,需要把上面的Invoke改成BeginInvoke
txtStatus.AppendText("RUN FINISH\r\n");
}
静态方法Run
Task.Run
是启动异步任务最常见的方法之一。它接受一个Action
或Func<T>
作为参数,并返回一个任务实例。这种方式适合于需要立即执行代码块的场景。
C#private void btnRun_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
this.Invoke(new Action(() =>
{
this.txtStatus.AppendText("FINISH");
}));
});
}
TaskFactory工厂
Task.Factory.StartNew
方法提供了更多的控制选项,比如任务的调度行为。它是一个较为灵活的启动任务的方式,但通常推荐使用Task.Run
,因为Task.Run
在默认情况下就能满足大多数需求。
C#private void btnRun_Click(object sender, EventArgs e)
{
TaskFactory factory = new TaskFactory();
factory.StartNew(() =>
{
this.Invoke(new Action(() =>
{
txtStatus.AppendText("FINISH1\r\n");
}));
Task.Delay(5000);
});
}
RunSynchronously同步启动
C#private void btnRun_Click(object sender, EventArgs e)
{
var t = new Task(() =>
{
this.txtStatus.AppendText("FINISH");
});
t.RunSynchronously();//同步方法
}
Task.ContinueWith
方法这不是直接启动新任务的方法,而是在一个任务完成后启动另一个任务。这种方式适用于任务之间有依赖关系的场景。
C#Task initialTask = Task.Run(() =>
{
// 初始异步执行的代码
Console.WriteLine("Initial task running...");
});
// initialTask完成后执行
Task continuationTask = initialTask.ContinueWith(previousTask =>
{
// 在initialTask完成后执行的代码
Console.WriteLine("Continuation task running...");
});
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!