是否可以将委托的执行从一个线程移动到另一个中间执行?

dev*_*os1 9 .net c# multithreading asynchronous

有没有什么方法可以抽象出特定委托可以执行的线程,这样我最初可以在调用线程上执行它,但如果最终花费的时间超过一定时间,则将执行移动到后台线程?

假设委托被编写为异步.我不是试图采用同步块并将它们移动到后台线程以增加并行性,而是我希望通过避免线程的开销来简化操作来提高异步执行的性能.

基本上我想知道是否有任何方式可以暂停执行委托或lambda,移动到另一个线程并恢复,如果我可以建立清晰的堆栈边界,等等.

我怀疑这是可能的,我只是好奇.

Bri*_*eon 3

这是可能的,但要正确执行会很尴尬且困难。实现这一点的最佳方法是使用协程。目前,.NET 中唯一适合协程范例的机制是 C# 通过yield return关键字的迭代器。理论上,您可以将某些东西组合在一起,从而允许方法的执行从一个线程转换到另一个线程1。然而,这无异于一个值得博客的黑客攻击,但我确实认为这是可能的。2

下一个最佳选择是继续升级到异步 CTP。这是 C# 中提供的一项功能,它可以让您完全按照您的要求进行操作。这是通过建议的await关键字和一些巧妙的利用也将包括在内的优雅地完成的。最终结果如下所示。

public async void SomeMethod()
{ 
  // Do stuff on the calling thread. 

  await ThreadPool.SwitchTo(); // Switch to the ThreadPool.

  // Do stuff on a ThreadPool thread now!

  await MyForm.Dispatcher.SwitchTo(); // Switch to the UI thread.

  // Do stuff on the UI thread now!
}
Run Code Online (Sandbox Code Playgroud)

这只是您可以使用 new 关键字执行的许多邪恶而酷的技巧之一await


1您实际上可以将代码执行注入到现有线程的唯一方法是目标专门设计为接受工作项形式的注入。

2您可以在此处查看我的答案,尝试await使用迭代器模仿关键字。MindTouch Dream框架是另一种可能更好的变体。关键是应该可以通过一些巧妙的黑客手段来引起线程切换。