最简洁的异步调用void方法的方法

div*_*nci 4 c# delegates asynchronous code-golf

我有一个方法,我想异步调用:

void Foo()
{
}
Run Code Online (Sandbox Code Playgroud)

我确实可以通过以下方式异步调用它:

delegate void DVoidMethod();
DVoidMethod FooDelegate = new DVoidMethod(Foo);
FooDelegate.BeginInvoke(null,null);
Run Code Online (Sandbox Code Playgroud)

有没有人有其他选择?

我认为三行代码太多了?

Meh*_*ari 10

免责声明:

不要在实际代码中使用它.这只是为了缩短提到的代码OP.要在不获取结果的情况下执行真正的异步调用,请使用:

ThreadPool.QueueUserWorkItem(stateObject => Foo());
Run Code Online (Sandbox Code Playgroud)

在框架中使用ActionFunc委托:

new Action(Foo).BeginInvoke(null, null);
Run Code Online (Sandbox Code Playgroud)

Action<T>自2.0以来一直存在.其他变种在3.5中添加.但是,在2.0中,您可以手动将其中一堆声明用于进一步使用; 甚至更好,使用LINQBridge.

  • 你仍然需要为此调用EndInvoke.http://www.interact-sw.co.uk/iangblog/2005/05/16/endinvokerequired Simon P Stevens使用ThreadPool得到了正确答案 (3认同)
  • 微软本身(Joe Duffy)建议不要使用.BeginInvoke,因为它会通过整个远程处理堆栈.我宁愿安排到ThreadPool(或者在4.0中将它设为任务) (2认同)

Sim*_*ens 8

怎么样:

ThreadPool.QueueUserWorkItem(new WaitCallback((o) => Foo()));
Run Code Online (Sandbox Code Playgroud)

更新以考虑更新版本的.net中提供的TPL API:

.Net 4及以上版本中,您可以:

Task.Factory.StartNew(() => Foo());
Run Code Online (Sandbox Code Playgroud)

.Net 4.5及以上版本中,您还可以:

Task.Run(() => Foo());
Run Code Online (Sandbox Code Playgroud)

Task.Factory.StartNewTask.Run之间的区别在于'StartNew'方法有一些额外的参数可以让你传递状态,任务创建选项和调度程序,以便在需要时为你提供额外的控制.