1.普通异步(Core直到6.0目前都不支持 BeginInvoke)
Func<string, string> func = (sr) => { return sr; };//先自定义委托
IAsyncResult asyncResult= func.BeginInvoke("sssssss", (ss) => {
object o= ss.AsyncState??"";//这个可以查出传入的回调参数
},"回调传入参数");//会开启新的线程,里面
//下面可以根据需求选用
string returnValue= func.EndInvoke(asyncResult);//获取委托的返回值,会卡住一直等待委托完成
asyncResult.AsyncWaitHandle.WaitOne();//等待异步委托完成
asyncResult.AsyncWaitHandle.WaitOne(-1);//一直等待完成为止
asyncResult.AsyncWaitHandle.WaitOne(10000);//等待10000ms没完成,就不等待了
2.线程池 framework 2.0开始有的
//ThreadPool.GetMinThreads(out int workerThreds,out int completionPortThreads);//设置最小线程数,最好不要设置,一设置就是全局的,容易导致死锁
ManualResetEvent ResetEvent=new ManualResetEvent(false);//可以做信号,判断线程池里面的任务是否完成,表示有信号时必须手动重置的线程同步事件
//public delegate void WaitCallback(object? state); //传入委托
WaitCallback callback = (sr) => {
ResetEvent.Set();
Console.WriteLine($"这是传入参数{sr}");
};
ThreadPool.QueueUserWorkItem(callback, "rrr");
ResetEvent.WaitOne();//判断是否完成线程的委托,会卡界面等待
WaitHandle.WaitAll(new ManualResetEvent[] { });//当有多个信号量要判断,用这个方法,注意ResetEvent.WaitAll(manualEvents);这等待的线程数不能大于64