有什么方法可以抽象出特定委托(delegate)可以在哪个线程上执行,这样一开始我可以在调用线程上执行它,但如果最终花费的时间超过一定数量,则将执行移至后台线程时间?
假设委托(delegate)被编写成异步的。我并没有尝试采用同步块(synchronized block)并将它们移动到后台线程以提高并行度,而是希望通过避免简单操作的线程开销来提高异步执行的性能。
基本上我想知道是否有任何方法可以暂停委托(delegate)或 lambda 的执行,移动到另一个线程并恢复,是否可以建立清晰的堆栈边界等。
我怀疑这是可能的,我只是好奇。
最佳答案
这是可能的,但这样做会很尴尬,也很难做到正确。实现这一目标的最佳方法是使用 coroutines . .NET 中目前唯一符合协程范例的机制是通过 yield return
关键字的 C# 迭代器。您可以理论上将一些东西组合在一起,允许方法的执行从一个线程转换到另一个1。然而,这不亚于博客值得破解,但我确实认为这是可能的。2
下一个最佳选择是继续升级到 Async 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!
}
这只是您可以使用新的 await
关键字实现的众多绝妙技巧之一。
1将代码执行实际注入(inject)现有线程的唯一方法是,如果目标专门设计为以工作项的形式接受注入(inject)。
2可以看到我的回答here尝试用迭代器模仿 await
关键字。 MindTouch Dream framework 是另一种可能更好的变体。关键是应该可以通过一些巧妙的黑客攻击来引起线程切换。
关于c# - 是否有可能将委托(delegate)的执行从一个线程移动到另一个中间执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6990477/