C#通过线程实现回调方法

          

           当启动一个线程去执行某件事情,但是我不知道此线程什么时候执行完,这时候就可以通过委托来实现回调,当线程执行完成后调用回调函数,来通知注册者。


方法:

public delegate void WeatherSearchCallBack();//回调委托
public WeatherSearchCallBack weatherSearchCallBack;//回调委托

       public void TestThreadStart(WeatherSearchCallBack wCallBack)
       {
           Thread td = new Thread(SearchWeather);
           td.Start(wCallBack);
       }

这一步是启动一个线程,并将回调函数作为线程执行函数的参数。

接下来:

       private void SearchWeather(object obj)
       {
          ...//执行线程的任务
          
           WeatherSearchCallBack wCallBack = obj as WeatherSearchCallBack;
           wCallBack();//执行完成后 调用回调函数通知此线程已经执行完成
       }

这也是线程加委托的一个用法。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
上传项目不支持Firefox,提示代码附件太大(1.4M),我写了30多分钟的描述全没了,太坑爹了。 10分有点贵,绝对原创,共2个代码文件300多行,下载请谨慎。你下载了,若绝对不爽在评论中说出来,不要让其他同学上当,如果觉得还可以也请留言。 代码采用多工作者多线程执行任务。通过暴露的方法往工作者传递消息,然后采用事件回调返回处理结果,实现的事件有OnThreadComplete,OnAddedTask,OnStart,OnSuccess,OnFailure,OnTimeout。 事件回调支持同步或异步,每工作者可以指定执行超间,避免线程阻塞死掉。队列采用线程安全的BlockingCollection,每组工作者用一个队列。委托采用Func来定义的,没有采用传统且不太好理解的Delegate。这让代码减少很多,也更容易理解。多线程应该采用消息中心来交换数据,这样就规避了线程同步交互,等待,阻塞等等,全部是异步调用,全部是接收消息工作,然后产生消息,线程间没有耦合,消息中心有很多成熟的方案如RabbitMQ, Redis(里面有简单的消息交换),微软有消息云服务等。如果应用不复杂,可以采用DB做个简单的消息中心,建议采用HTTP接口来获取与写入消息,方便将来升级重构消息中心。 开发环境VS2012,Framework4.0,代码注释量很大,如果你高兴这代码你可以随意蹂躏,如果你有建设性意见请告诉我。 下面是部分测试代码: //发送消息方法容器 var msgContainer = new Hashtable(); //创建并启动工作者 foreach (var key in workers.Keys) { //创建工作者 //启动5个线程,异步事件回调,方法执行20秒超,程序跑起来有100个线程,由于引入超控制,实际线程将达100+50 //下面的20个工作组,有5个是超的,主要测试OnTimeout事件,你可以设置seleep的间来控制 //我把sleep的间设置的有点长,方便你测试 //测试的候你会看见有异常,那是应为Timeout我采用的是Thread.Abort方法,这样才出发了ontimeout事件 var worker = new Sehui.Worker(5, key.ToString(), (Func)workers[key], false, new TimeSpan(0, 0, 20)); worker.OnStart += worker_OnEvent; worker.OnSuccess += worker_OnEvent; worker.OnFailure += worker_OnEvent; worker.OnTimeout += worker_OnEvent; //启动工作者 worker.Start(); //将增加消息方法放到Hashtable中 //这里我是偷懒,下面可以用循环的方式往线程中add message msgContainer.Add(key.ToString(), new Func(worker.AddTask)); } //向20个工作者发送消息,每个工作者发送20条消息 for (var i = 0; i < 20; i++) { for (var k = 0; k < 20; k++) { ((Func)msgContainer["SyncDb" + k])("[Work " + k + "] Message " + i); Console.WriteLine("send msg to worker{0},msgid:{1}", k, i); } }
C# 中,线程间通信可以使用回调函数来实现回调函数是一种将方法作为参数传递给其他方法的技术。以下是一个使用回调函数实现线程通信的示例: ```csharp using System; using System.Threading; class Program { static void Main(string[] args) { Worker worker = new Worker(); worker.Start(); // 等待用户输入任意键停止工作线程 Console.ReadKey(); worker.Stop(); } } class Worker { private Thread thread; private bool isRunning; public void Start() { isRunning = true; thread = new Thread(DoWork); thread.Start(); } public void Stop() { isRunning = false; thread.Join(); } private void DoWork() { while (isRunning) { // 执行工作任务 // 当完成工作后,调用回调函数通知主线程 CallbackFunction(); } } private void CallbackFunction() { // 在这里执行回调操作,例如更新UI、处理结果等 Console.WriteLine("工作线程完成任务,回调函数被调用"); } } ``` 在上面的示例中,`Worker` 类表示一个工作线程,`Start` 方法启动工作线程,`Stop` 方法停止工作线程。`DoWork` 方法是工作线程的主函数,在这个方法中执行具体的工作任务。当工作任务完成后,通过调用 `CallbackFunction` 方法来执行回调操作。 在 `CallbackFunction` 方法中,你可以在其中执行需要在主线程中进行的操作,比如更新用户界面或处理工作结果。 请注意,此示例中的回调函数是在同一线程中执行的。如果需要在不同线程中执行回调函数,你可能需要使用 `Dispatcher` 或其他线程间通信机制来确保正确的线程调度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值