gpt4 book ai didi

c# - 在 C# 中从非异步调用异步代码的最佳方式是什么(即发即弃)

转载 作者:太空宇宙 更新时间:2023-11-03 22:53:13 26 4
gpt4 key购买 nike

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);

关于c# - 在 C# 中从非异步调用异步代码的最佳方式是什么(即发即弃),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46555221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com