多线程1——BeginInvoke和线程池

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
posted @ 2022-05-11 20:38  乌柒柒  阅读(76)  评论(0编辑  收藏  举报