强制停止正在执行的方法

摘要:如何暴力停止当前正在执行中的方法?利用线程强制退出,终止当前方法的执行。可以用于用户频繁操作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 @ 2020-06-04 11:56  荀幽  阅读(1575)  评论(0编辑  收藏  举报