C# 如何在不使用Task.Run的情况下编写异步兼容方法
重新编写我的C# 如何在不使用Task.Run的情况下编写异步兼容方法,c#,.net,task-parallel-library,async-await,C#,.net,Task Parallel Library,Async Await,重新编写我的SlowMethodAsyncasync方法的合适方法是什么?该方法执行长时间运行的任务,可以等待,但不使用task.Run 我可以用任务来完成。按如下方式运行: public async Task SlowMethodAsync() { await Task.Run(() => SlowMethod()); } public void SlowMethod() { //heavy math calculation process takes place he
SlowMethodAsync
async
方法的合适方法是什么?该方法执行长时间运行的任务,可以等待,但不使用task.Run
我可以用任务来完成。按如下方式运行:
public async Task SlowMethodAsync()
{
await Task.Run(() => SlowMethod());
}
public void SlowMethod()
{
//heavy math calculation process takes place here
}
如上所示,代码将从线程池中生成一个新线程。如果可以采用不同的方法,它会在调用线程上运行,并以任何方式阻止它,因为SlowMethod
内容是一个坚实的数学处理块,没有任何屈服和时间片放弃
只是为了澄清我需要我的方法保持异步,因为它解除了我的UI线程的阻塞。只是在寻找另一种可能的方法,以一种与当前不同的方式来实现这一点,同时保留异步方法签名。async
方法用于异步操作。它们允许不为非CPU绑定的工作阻塞线程。如果您的SlowMethod
具有当前同步执行的任何IO绑定操作(例如Stream.Read
或Socket.Send
),您可以在async
方法中将这些操作交换为async
操作和wait
操作
在您的情况下(数学处理),代码可能主要受CPU限制,因此除了将工作转移到线程池
线程(使用Task.Run
)之外,没有理由使用async
保持SlowMethod的原样,它将在调用线程上运行。
关于您的更新:您肯定希望使用任务。运行(或任务.Factory.StartNew
重载之一)将您的工作卸载到另一个线程。异步
方法用于异步操作。它们允许不为非CPU绑定的工作阻塞线程。如果您的SlowMethod
具有当前同步执行的任何IO绑定操作(例如Stream.Read
或Socket.Send
),您可以在async
方法中将这些操作交换为async
操作和wait
操作
在您的情况下(数学处理),代码可能主要受CPU限制,因此除了将工作转移到线程池
线程(使用Task.Run
)之外,没有理由使用async
保持SlowMethod的原样,它将在调用线程上运行。
关于您的更新:您肯定希望使用任务。运行(或任务.Factory.StartNew中的一个重载)将您的工作卸载到另一个线程。实际上,对于您的特定情况,您应该使用
await Task.Factory.StartNew(() => SlowMethod(), TaskCreationOptions.LongRunning)
这将允许调度程序在适当的位置(可能在新线程中)运行同步任务,从而不会阻塞线程池(这并不是为CPU繁重的工作负载而设计的)
同步调用SlowMethod
不是更好吗?等待它能带来什么好处?实际上,对于您的具体情况,您应该使用
await Task.Factory.StartNew(() => SlowMethod(), TaskCreationOptions.LongRunning)
这将允许调度程序在适当的位置(可能在新线程中)运行同步任务,从而不会阻塞线程池(这并不是为CPU繁重的工作负载而设计的)
同步调用SlowMethod
不是更好吗?等待它有什么好处?如果它都是同步的,为什么希望它是异步的?
?如果它是库代码,不要这样做。如果是应用程序代码,则取决于应用程序的类型。如果都是同步的,为什么希望它是async
?如果是库代码,则不要这样做。如果是应用程序代码,则取决于应用程序的类型。异步运行SlowMethod方法允许UI线程继续。因此,这可能是一个不错的解决方案,可以在允许UI继续的同时将工作卸载到另一个线程上。如果您在线程池中执行了太多操作,您可能会开始遇到意外的IO和计时器延迟,因为您与大量框架代码共享线程池,并且应该尊重它!当线程池线程忙于执行长时间运行的任务时,线程池不足可能会成为一个真正的问题。异步运行SlowMethod方法允许UI线程继续。因此,这可能是一个不错的解决方案,可以在允许UI继续运行的同时将工作卸载到另一个线程上。如果您在线程池中执行了太多操作,您可能会开始遇到意外的IO和计时器延迟,因为您与大量框架代码共享线程池,并且应该尊重它!当线程池线程忙于执行长时间运行的任务时,线程池不足可能会成为一个真正的问题。谢谢。“不受CPU限制的工作”是我想要的。所有framework*异步方法都是IO绑定的,所以我不应该一开始就尝试复制它们。谢谢。“不受CPU限制的工作”是我想要的。所有的framework*异步方法都是IO绑定的,所以我不应该一开始就尝试复制它们。