public class ThreadHelper { public static void RunSafeThread(Control ctrl, MethodInvoker invoker) { if(ctrl != null && !ctrl.IsDisposed) { try { if (ctrl.InvokeRequired) { ctrl.Invoke(invoker); } else { invoker(); } } catch { } } } public static Thread Threading<TReturn>(ThreadDelegate<TReturn> method, ThreadCallback<TReturn> callback) { Thread thread = new Thread(() => { IAsyncResult result = method.BeginInvoke(null, null); TReturn returnValue = method.EndInvoke(result); if(callback != null) { callback(returnValue); } }); thread.Start(); return thread; } public static Thread Threading<TReturn>(ThreadDelegateParams<TReturn> method, object[] parameters, ThreadCallback<TReturn> callback) { Thread thread = new Thread(() => { IAsyncResult result = method.BeginInvoke(ref parameters, null, null); TReturn returnValue = method.EndInvoke(ref parameters, result); if (callback != null) { callback(returnValue); } }); thread.Start(); return thread; } public static Thread Threading<TReturn>(ThreadDelegateParams<TReturn> method, object[] parameters, ThreadCallbackParams<TReturn> callback) { Thread thread = new Thread(() => { IAsyncResult result = method.BeginInvoke(ref parameters, null, null); TReturn returnValue = method.EndInvoke(ref parameters, result); if (callback != null) { callback(returnValue, parameters); } }); thread.Start(); return thread; } public delegate TReturn ThreadCallback<TReturn>(TReturn returnValue); public delegate TReturn ThreadCallbackParams<TReturn>(TReturn returnValue, object[] threadDelegateParams); public delegate TReturn ThreadDelegate<TReturn>(); public delegate TReturn ThreadDelegateParams<TReturn>(ref object[] parameters); }