
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace 函数执行超时研究 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { string name = ""; Thread threadToKill = null; Action wrappedAction = () => { threadToKill = Thread.CurrentThread; name = DoWork1(3); }; IAsyncResult result = wrappedAction.BeginInvoke(null, null); if (result.AsyncWaitHandle.WaitOne(3000)) { wrappedAction.EndInvoke(result); } else { threadToKill.Abort(); throw new TimeoutException(); } MessageBox.Show(name); } private void button1_Click(object sender, EventArgs e) { CallWithTimeout(DoWork,4000); } public void DoWork() { Thread.Sleep(3000); } public string DoWork1(int num) { Thread.Sleep(2000); return "hello"; } /// <summary> /// 执行函数超时,Action表示委托,函数没有参数没有返回值 /// </summary> /// <param name="action"></param> /// <param name="timeoutMilliseconds"></param> void CallWithTimeout(Action action, int timeoutMilliseconds) { Thread threadToKill = null; Action wrappedAction = () => { threadToKill = Thread.CurrentThread; action(); }; IAsyncResult result = wrappedAction.BeginInvoke(null, null); if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds)) { wrappedAction.EndInvoke(result); } else { threadToKill.Abort(); throw new TimeoutException(); } } } } |
|---|