.NET 如何封装一个多线程处理器 跪求思路!

zjx198934 2010-10-14 01:48:41
目前要做的是一个线程处理器程序(可能不准确),要达到以下目地:

当程序的某个模块需要单独一个后台线程处理的时候,直接调用这个处理器,处理器里面会NEW一个线程来处理这个模块,执行完毕后给主线程一个回馈,也有可能会返回一个值或调用主线程中的一个方法。

我的思路是调用处理器时,传递两个参数,一个是线程要执行的具体方法,一个是线程执行完后的回调方法,然后在处理器中NEW一个线程处理具体方法,处理完后调用回调方法使主线程能够得到结果。

小弟使用delegate,ThreadPool尝试了一下没成功! 希望大家给点而思路和方法! 跪谢了!
...全文
438 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
啊飞凤飞飞 2012-10-30
  • 打赏
  • 举报
回复
看了下 BackgroundWorker ,真的很好用,之前一直为这个伤透脑筋。
drawying 2010-10-18
  • 打赏
  • 举报
回复
学习学习
cgllj2019 2010-10-16
  • 打赏
  • 举报
回复
还没遇到这种需求

学习了
  • 打赏
  • 举报
回复
除此以外,再比如最基本地.net编译知识,对于任意一个Delegate,都会自动编译出.BeginInvoke方法来。
  • 打赏
  • 举报
回复
整天重新发明别人玩剩下的东西之前,最好先看看.net框架中相同功能的组件时的源代码,往往可以避免空洞地“研究”什么新发明。你看过.net框架中BackgroundWorker的源代码了吗?
  • 打赏
  • 举报
回复
整天重复发明别人玩剩下的东西,不如先去研究框架里别人发布的最基本的东西。

你在研究你的发明之前,看过你整天使用的.net框架中的BackgroundWorker的源代码了吗?
zjx198934 2010-10-16
  • 打赏
  • 举报
回复
我想到一个解决方案是HTTP长连接来维持一个连接直到线程任务完成! 但是如果是这样的话新建一个线程来处理一个程序还有意义吗? 比如我用AJAX异步请求就可以实现回调 那不是没必要新起一个线程了?
zjx198934 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 wuyazhe 的回复:]
BackgroundWorker的确是个很好的实现方法。
不过这个不支持.net cf开发。对于.net下很多“高级”玩意,我不太喜欢,本就是个多线程,弄出那么多套,最终还不都一样的原理,不过我不排斥,这些封装的确让一部分的工作简化了,只是职业习惯,我尽量选择可以通用mobile/win的方法,因为我开发的软件都要通用mobile/win。因为我总遇到需要把pc功能移植到mobile下的情况,用……
[/Quote]

同意 ! 逍遥哥 你帮我封装的这个类对我帮助很大,但是我在WEB程序上通过同步和异步都测试了一下,因为HTTP协议是无连接的,当我页面触发一个事件后,后台程序新起了一个线程处理逻辑,但是当处理逻辑结束返回结果的时候HTTP连接已经断掉了,这下该怎么弄呢? 整了一会儿都没想到好办法!



兔子-顾问 2010-10-16
  • 打赏
  • 举报
回复

public static void Test()
{
AsyncRunner<int> runTest = new AsyncRunner<int>();
runTest.AsyncRun(
//调用的方法
(AsyncRunner<int>.CallHandler)delegate(object[] p)
{
//以下是你的想异步执行的代码,你也可以直接调用一个另外的方法
int start = (int)p[0];
int len = (int)p[1];
int result = 1;
for (int i = start; i < len; i++)
{
Console.WriteLine(i);
Thread.Sleep(100);
result *= i;
}
return result;
},
//这里是参数列表,对应在上一个委托参数中使用
new object[] { 1, 10 },
//这里是回调函数,result是结果,类型是泛化类型。这个方法会在异步执行完调用方法后调用
(AsyncRunner<int>.CallBackHandler)delegate(int result)
{
Console.WriteLine("result is " + result.ToString());
});
}

/// <summary>
/// 异步执行类
/// </summary>
/// <typeparam name="T"></typeparam>
public class AsyncRunner<T>
{
/// <summary>
/// 异步执行的结果
/// </summary>
public T result { get; set; }
/// <summary>
/// 方法委托
/// </summary>
/// <param name="p">参数</param>
/// <returns>返回值</returns>
public delegate T CallHandler(object[] p);
/// <summary>
/// 异步调用后的处理
/// </summary>
/// <param name="result">使用之前的结果</param>
public delegate void CallBackHandler(T result);
/// <summary>
/// 异步调用
/// </summary>
/// <param name="runner">AsyncRunner<T>.CallHandler对象</param>
/// <param name="p">参数</param>
/// <param name="back">回调的方法</param>
public void AsyncRun(CallHandler runner, object[] p, CallBackHandler back)
{
new Thread((ThreadStart)delegate
{
result = runner(p);
if (back != null) back(result);
}).Start();
}
}


看这样是否能符合你想法。
兔子-顾问 2010-10-16
  • 打赏
  • 举报
回复
BackgroundWorker的确是个很好的实现方法。
不过这个不支持.net cf开发。对于.net下很多“高级”玩意,我不太喜欢,本就是个多线程,弄出那么多套,最终还不都一样的原理,不过我不排斥,这些封装的确让一部分的工作简化了,只是职业习惯,我尽量选择可以通用mobile/win的方法,因为我开发的软件都要通用mobile/win。因为我总遇到需要把pc功能移植到mobile下的情况,用习惯这类高级玩意,在移植的时候需要修改大量代码,不过如果不考虑mobile,用BackgroundWorker的确是个不错的选择。
zhangjianxing00 2010-10-15
  • 打赏
  • 举报
回复
学习学习
足球中国 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhoufoxcn 的回复:]
可以自己写一个类,这个类封装一个Thread成员,这样这个类就既可以实现线程的功能又能执行区别于线程的方法。
[/Quote]
这个比较不错。多数都是这么干的。
国外一个牛人包装了一个。是在一个书上的。
用起来挺麻烦一直都没有用。
书上面有个大虾。书名是啥忘了。
zjx198934 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wuyazhe 的回复:]
委托本身就有BeginInvoke和EndInvoke方法,就是你要的结果,所以你还要自己再抽象也差不多。
[/Quote]
是的 我也知道这个方法 但是BeginInvoke和EndInvoke执行的中间 可能回阻塞线程 这样的话就达不到异步的目地了 不知道BeginInvoke是的原理 是CLR又开了一个线程还是其它?
兔子-顾问 2010-10-15
  • 打赏
  • 举报
回复
委托本身就有BeginInvoke和EndInvoke方法,就是你要的结果,所以你还要自己再抽象也差不多。
zjx198934 2010-10-15
  • 打赏
  • 举报
回复
说简单点儿 实际上就是想实现 主线程中开启子线程 然后主线程继续运行 子线程结束后返回值到主线程 主线程得到值后能够继续本来的方法 举个例子效果 WEB程序中 我想产生报表 那么想开一个线程去处理 用户还可以干其他事情 报表生成成功后给用户提示 用户就可以看生成好的报表 类似的不只生成报表...
zjx198934 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 wuyazhe 的回复:]
引用 16 楼 zjx198934 的回复:
引用 15 楼 wuyazhe 的回复:
委托本身就有BeginInvoke和EndInvoke方法,就是你要的结果,所以你还要自己再抽象也差不多。

是的 我也知道这个方法 但是BeginInvoke和EndInvoke执行的中间 可能回阻塞线程 这样的话就达不到异步的目地了 不知道BeginInvoke是的原理 是CLR又开了一个线程还是其……
[/Quote]
恩 我测试了一下 如果在主线程中同时调用BeginInvoke和EndInvoke的话 主线程回阻塞 但是如果在BeginInvoke的回调函数中调用EndInvoke的话就不回阻塞 但是我得到的结果就无法返回到主线程继续以前的方法了(主线程会用到这个结果)
zjx198934 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 gouhan02 的回复:]
这样的线程类我有。
[/Quote]

能发个给我学些下不呢? 谢谢了 jianxin_home@163.com
zjx198934 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dengtaolang 的回复:]
引用 14 楼 zjx198934 的回复:
说简单点儿 实际上就是想实现 主线程中开启子线程 然后主线程继续运行 子线程结束后返回值到主线程 主线程得到值后能够继续本来的方法 举个例子效果 WEB程序中 我想产生报表 那么想开一个线程去处理 用户还可以干其他事情 报表生成成功后给用户提示 用户就可以看生成好的报表 类似的不只生成报表...


主线程继续运行怎么又要返回值.只能把处理结果……
[/Quote]

比如是WEB程序的话! 我新开一个线程处理报表的话! 怎么样把处理好后的结果返回到页面呢?
兔子-顾问 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zjx198934 的回复:]
引用 15 楼 wuyazhe 的回复:
委托本身就有BeginInvoke和EndInvoke方法,就是你要的结果,所以你还要自己再抽象也差不多。

是的 我也知道这个方法 但是BeginInvoke和EndInvoke执行的中间 可能回阻塞线程 这样的话就达不到异步的目地了 不知道BeginInvoke是的原理 是CLR又开了一个线程还是其它?
[/Quote]
不会阻塞的,你注意,我说的是委托的。不是控件的。控件的BeginInvoke和委托的完全不同原理。
ljb3326 2010-10-15
  • 打赏
  • 举报
回复
路过学习!!!!!!!!!
加载更多回复(16)

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧