c# - 是否有可能将委托(delegate)的执行从一个线程移动到另一个中间执行?

标签 c# .net multithreading asynchronous

有什么方法可以抽象出特定委托(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/

相关文章:

c# - 按钮单击事件未在 ASP .Net 中的使用控件内触发

C# - 将十六进制/ulong 值的重要部分转换为字符串

java - 如何使用 Java 从 XML 文件创建线程

c# - 检查 .NET 中服务器是否可访问的最佳方法?

c# - 在 ASP.NET 中为购物车系统创建数量更新按钮

java - 使用 java 套接字向多个客户端传输大文件的最佳方法

Python 线程名称未显示在 ps 或 htop 上

c# - OnClientClick 在 ValidationGroup 之前触发

c# - 如何映射两个不同类型的表达式?

.net - 压缩对象指针的目的是什么?