强制停止正在执行的方法

摘要:如何暴力停止当前正在执行中的方法?利用线程强制退出,终止当前方法的执行。可以用于用户频繁操作UI请求后台服务,操作耗时等业务场景。

废话不说,上代码

复制代码
 1  /// <summary>
 2     /// 可强制终止执行的方法。用在比较耗时的操作没有结果的时候,强制退出上次的执行操作,以确保本次正确执行
 3     /// </summary>
 4     public class TerminableMethod
 5     {
 6         private System.Threading.Thread _thread = null;
 7 
 8         private Action<object> _action;
 9 
10         public TerminableMethod(Action<object> action)
11         {
12             this._action = action;
13         }
14 
15         /// <summary>
16         /// 启用方法,一定覆盖上次执行
17         /// </summary>
18         /// <param name="parameter"></param>
19         public void Start(object parameter)
20         {
21             try
22             {
23                 if (_thread != null)
24                 {
25                     _thread.Abort();
26                     _thread = null;
27                 }
28                 _thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(_action));
29                 _thread.IsBackground = true;
30                 _thread.Start(parameter);
31             }
32             catch (Exception ex)
33             {
34                 Console.WriteLine("启用方法异常!" + ex.Message);
35                 throw ex;
36             }
37         }
38     }
复制代码

使用:

复制代码
 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             TerminableMethod methodAbort = new TerminableMethod(MethodAbortTest);
 6             Task.Run(() =>
 7             {
 8                 while (true)
 9                 {
10                     var r = new System.Random(Guid.NewGuid().GetHashCode());
11                     var max = r.Next(100, 300);
12                     methodAbort.Start(max);
13                     System.Threading.Thread.Sleep(5);
14                 }
15             });
16             Console.ReadLine();
17         }
18 
19         static void MethodAbortTest(object obj)
20         {
21             int maxVal = (int)obj;
22             Console.WriteLine("开始执行任务!");
23             int i = 0;
24             while (i++ < maxVal)
25             {
26                 Console.WriteLine("当前执行任务:" + i);
27                 System.Threading.Thread.Sleep(1);
28             }
29             Console.WriteLine("执行任务结束!");
30         }
31     }
复制代码

注意:每次执行TerminableMethod.Start,都能确保本次流程从头开始。所以每次操作前,需要对上次操作的资源进行初始化。

 

posted @   荀幽  阅读(1595)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示