异步运行任何C#方法。可能的

异步运行任何C#方法。可能的,c#,async-await,C#,Async Await,使用Task.Run()可以异步运行任何方法,如 public int Increase(int val) { return val + 1 } int increased = await Task.Run ( () => return Increase(3) ); 是否可以创建一个扩展方法,像异步一样运行任何方法 var val = 1; int increased = await Increased(3).AsAsync(); 您无法编写一个asasasync方法来实现您

使用Task.Run()可以异步运行任何方法,如

public int Increase(int val)
{
   return val + 1
}


int increased = await Task.Run ( () => return Increase(3) );
是否可以创建一个扩展方法,像异步一样运行任何方法

var val = 1;
int increased = await Increased(3).AsAsync();

您无法编写一个
asasasync
方法来实现您的建议。在代码
reased(3).asasasync()
中,在调用
asasasync
之前,您已经同步执行了
reased(3)
并计算了其结果。在继续之前不执行该代码已经太迟了。

如果您有一个CPU绑定的任务,并且您想将异步作为一个方便的包装器也用于CPU绑定的操作,那么您可以定义一个扩展(模糊地基于此示例)

如下

   int increased = await ((Func<int,int>)(t =>
       Increase(t))).AsCpuBoundAsync(3);
int递增=等待(Func)(t=>
增加(t))。AsCpuBoundAsync(3);

您的示例甚至无法编译。应该是
Task.Run(()=>Increase(3))@juharr这只是一个示例,没有真正的代码。我只想有一个比Task.Run()更简单的方法。如果没有第三方工具在C#编译器得到语法之前转换语法,就不可能完全使用您提出的语法。您可以使用扩展方法在有限的范围内(即针对特定的方法签名)或在广泛的范围内使用预处理代码的工具来完成您试图完成的工作,但是有太多的可能的答案采用这些方法来解决堆栈溢出问题,即使假设这是值得的(这是有争议的)。请看这个@MachineLearning,它是基于枚举器的枚举的首选工具。这是因为当出现对值的访问权限时,会调用Enumerator。这对方法不起作用。到目前为止,它显然不会像这样简单。我知道,当返回递增的结果时,这里会调用Async()。但是我正在寻找一种更简单的方法来在任何方法上使用异步。@PeterLiguda如果底层不支持异步操作,那么就不应该公开异步操作。这实际上是一个谎言。只需公开同步操作。如果调用方碰巧需要异步执行操作,则可以使用
Task.Run
将工作三次有效地卸载到另一个线程。创建这些方法的版本是一种反模式,当它们不支持适当的异步时,这些方法的所有工作都在其他线程中完成。@Servy您有一个文档将其描述为反模式吗?还是仅仅是个人感觉?@PeterLiguda根据定义,某事物是否是反模式是一个观点问题。这是这个领域的专家们普遍持有的观点,但对于哪些做法是好是坏,并没有“官方”的仲裁者。如果您愿意,欢迎您在该领域进行研究并听取他人的意见。@PeterLiguda Stephen Toub说,添加只调用Task.Run的异步包装器不是您应该做的事情。他的文章解释了.NET团队采取这种立场的原因。
    public static int Increase(int val)
    {
       //doing CPU bound activities...
       return val + 1;
    }
   int increased = await ((Func<int,int>)(t =>
       Increase(t))).AsCpuBoundAsync(3);