Thread
1.利用Thread开启异步线程:
ThreadStart threadStart = new ThreadStart(() => this.DoSomethingLong("btnThreads_Click"));
Thread thread = new Thread(threadStart);
thread.Start();
2.设置前台前程与后台线程:
thread.IsBackground = true;
默认是前台线程,也就是当UI线程退出后,整个进程并不会结束,知道所有的的计算线程执行完,才退出,反之,后台进程是当UI线程退出后,进程立即退出,不会再进行计算
3.线程等待:
thread.Join();
把当前线程join到主线程,主线程等待当前线程执行完
4.基于Thread封装支持回调:
private void ThreadWithCallback(ThreadStart threadStart, Action callback)
{
ThreadStart threadNew = new ThreadStart(
()=>
{
threadStart.Invoke();
callback();
});
Thread thread = new Thread(threadNew);
thread.Start();
}
测试回调:
ThreadStart threadStart = new ThreadStart(() => {
this.DoSomethingLong("btnThreads_Click");
});
this.ThreadWithCallback(threadStart, () => { Console.WriteLine($"这里是回调{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); });
5.基于Thread封装带返回值:
private Func<T> ThreadWithReturn<T>(Func<T> funcT)
{
T t = default(T);
ThreadStart startNew = new ThreadStart(
() =>
{
t = funcT.Invoke();
});
Thread thread = new Thread(startNew);
thread.Start();
return new Func<T>(() =>
{
thread.Join();
return t;
});
}
测试返回值:
Func<int> func = this.ThreadWithReturn(()=>
{
Thread.Sleep(2000);
Console.WriteLine($"这里是ThreadStart {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
return 12345;
});
int iResult = func.Invoke();
Console.WriteLine(iResult.ToString());
}
Console.WriteLine($"****************btnThreads_Click END {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");