Trying to achieve Fire and Forget:
class Program
{
static void Main(string[] args)
{
var my = new MyClass();
my.OrderForm_Load();
Console.ReadLine();
}
}
internal class MyClass
{
//Blocking
public void OrderForm_Load()
{
var t1 = new ServiceTask();
Task.Run(() => t1.PersistTask()); //Approach 1:
//[OR]
t1.PersistTask(); //Approach 2: Has compiler errors CS4014
Console.WriteLine("Second");
}
}
internal class ServiceTask
{
//Non-Blocking
public async Task PersistTask()
{
var resultTask = Task.Run(() =>
{
Thread.Sleep(3000);
Console.WriteLine("First");
return Task.FromResult(0);
});
await resultTask;
}
}
介于方法 1 和方法 2 之间;我更喜欢方法 1。是否有任何其他更好的方法 从 OrderForm_Load() 方法调用 PersistTask()?我有一个同事对使用 Task.Run 犹豫不决,但想看看是否有其他更好的方法。
目标是,我们希望尽快打印“second”,而不用担心打印“first”的方法。即发即弃。
实现 fire and forget
方法的最佳方式是使用 async void
修饰符:
public async void PersistTask()
{
// no need to assign the task if you are just going to await for it.
await Task.Run(() =>
{
Thread.Sleep(3000);
Console.WriteLine("First");
return Task.FromResult(0);
});
}
并使用以下方式调用它:
//Blocking
public void OrderForm_Load()
{
var t1 = new ServiceTask();
Task.Run(() => t1.PersistTask()); //Approach 1
//[OR]
t1.PersistTask(); //Approach 2
Console.WriteLine("Second");
}
不过还有另一个区别:Task.Run
最适合 CPU 绑定(bind)方法。查看更多详情 in this answer .
另外,请注意您应该避免在异步工作中使用同步等待。所以,改变这个:
Thread.Sleep(3000);
为此:
Task.Delay(3000);
我是一名优秀的程序员,十分优秀!