|
1
96
这里真正棘手的部分是通过将执行器线程从Action传递回一个可以中止的地方来杀死长时间运行的任务。我通过使用一个包装委托来实现这一点,该委托将要杀死的线程传递给创建lambda的方法中的一个局部变量。 我举这个例子,供大家欣赏。您真正感兴趣的方法是CallWithTimeout。 这将通过中止长时间运行的线程并吞下ThreadAbortException来取消它 : 用途:
静态方法完成工作:
|
![]() |
2
73
我们在生产中大量使用这样的代码 n
实现是开源的,即使在并行计算场景中也能高效工作,并且可以作为 Lokad Shared Libraries
这段代码仍然有缺陷,你可以尝试使用这个小测试程序:
有一个种族条件。很明显,在方法之后可能会引发ThreadAbortException
|
![]() |
3
15
好吧,你可以用委托来做一些事情(BeginInvoke,回调设置一个标志,原始代码等待该标志或超时),但问题是很难关闭正在运行的代码。例如,杀死(或暂停)一个线程是危险的。..所以我认为没有一种简单的方法来稳健地做到这一点。 我会发布这个,但请注意,它并不理想——它不会停止长时间运行的任务,也不会在失败时正确清理。
|
![]() |
4
13
Pop Catalin的精彩回答的一些小变化:
已添加重载以支持信号工作器取消执行:
|
![]() |
5
10
我会这样做:
|
![]() |
6
7
我刚刚把它敲了出来,所以它可能需要一些改进,但会做你想做的事。这是一个简单的控制台应用程序,但演示了所需的原则。
|
![]() |
7
2
使用Thread怎么样。加入(int超时)?
|
![]() |
Jess The Witch · GCP云功能中处理延迟任务的模式 7 月前 |
![]() |
Plup · 连接失败时,PyMongo异步客户端未引发异常 8 月前 |
![]() |
user1233894 · 尝试从全局函数传递值 8 月前 |
![]() |
Fabiano Taioli · 管理单线程Rust中的阻塞函数 1 年前 |
![]() |
river7816 · 为什么spdlog不在async函数中打印 1 年前 |