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)
在框架中使用Action和Func委托:
new Action(Foo).BeginInvoke(null, null);
Run Code Online (Sandbox Code Playgroud)
Action<T>自2.0以来一直存在.其他变种在3.5中添加.但是,在2.0中,您可以手动将其中一堆声明用于进一步使用; 甚至更好,使用LINQBridge.
怎么样:
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.StartNew和Task.Run之间的区别在于'StartNew'方法有一些额外的参数可以让你传递状态,任务创建选项和调度程序,以便在需要时为你提供额外的控制.