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);
}