【发布时间】:2018-05-08 17:38:53
【问题描述】:
我有一个 C# 程序,它执行一些服务调用。 我需要在这个程序中添加一些代码,以便能够在我单击按钮(winform)时停止这些服务调用[例如,如果调用太长并且用户很无聊]。
困难在于我无法修改执行调用的代码块。
为了做到这一点,我计划使用 Unity 框架进行一些拦截。 每次输入服务调用代码块时,我都想创建一个任务。然后,如果用户单击我的按钮,则取消此任务。
我查看了 CancellationToken 但问题是我不能修改调用块,所以我不能做 if(ct.IsCancellationRequested) 或 ct.ThrowIfCancellationRequested();
AutoResetEvent 和 ManualResetEvent 也是如此。
这些调用并不总是异步的,并且是使用cancellationToken进行的,所以我认为捕获OperationCanceledException是不可能的。
我也研究过使用线程并做了一些Thread.Abort(),但这种方法似乎每次有人调用它都会杀死小狗。
这是我当前程序的示例(尚未实现拦截,我想先在一次调用中测试它):
private void Test()
{
Task.Factory.StartNew(MyServiceCallFunction); // How to cancel the task when I press a button ?
}
// Can't touch the inside of this function :
private void MyServiceCallFunction()
{
// Blabla I prepare the datas for the call
// Blabla I do the call
}
我该怎么做? (我没有义务使用任务)
谢谢,
【问题讨论】:
-
不要使用
Threads,除非你认为你可以比 .NET 框架更好地管理它们 -
@user1274820 你并不关心你造成的所有问题并不意味着它们不存在。 TPL 没有公开中止底层线程的方法,不是因为它试图残忍或疏忽,而是因为用户根本不知道它导致的复杂性以及如何以这种方式设计他们的程序它将在代码中几乎任何地方抛出任意异常的情况下发挥作用。在这种情况下,地球上几乎没有任何程序可以正常运行。
-
@user1274820 所以,如果你站在马路上,一辆汽车向你开过来,你会捂住眼睛,因为你没有注意到的问题不是问题吗?你没有意识到坏事正在发生并不意味着它们没有发生,这只是意味着你实际上解决这些问题的能力要低得多。
-
@wdosanjos 请停止传播错误信息。
Thread.Abort()不折旧。查一下。
标签: c# multithreading