Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不使用Task.Run的情况下编写异步兼容方法_C#_.net_Task Parallel Library_Async Await - Fatal编程技术网

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绑定的,所以我不应该一开始就尝试复制它们。