关于 C# 多线程

andyliuxiaobo 2013-08-12 03:01:01
最近在项目中用到了多线程,其实就是一个线程获取数据,然后通知主线程更新数据,那个获取数据的方式是一直运行的,

public Thread GetMeg =null;
public void Get()
{
GetMeg = new Thread(new ThreadStart(getMessage));
GetMeg.IsBackground = true;
GetMeg.Start();
}
这是我调用获取数据的方式

getMessage 方法是一个http获取的方式,循环执行,
目前遇到一个问题,这个多线程在有时候成功,有时候没有效果(getMessage 方法执行,但是UI假死),请教一下,这是是不是我代码中调用线程的访问存在问题导致的?
...全文
156 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
andyliuxiaobo 2013-08-12
  • 打赏
  • 举报
回复
在补充一点,我的这个线程不是在窗体的cs中创建的,是在类中建的,这样有问题吗?
andyliuxiaobo 2013-08-12
  • 打赏
  • 举报
回复
引用 6 楼 lizhi3186575 的回复:
直接使用BackgroundWorker这个控件,具体参考:http://www.cnblogs.com/zhili/archive/2013/05/11/EAP.html
谢谢 我去看看
andyliuxiaobo 2013-08-12
  • 打赏
  • 举报
回复
引用 5 楼 szj820 的回复:
线程太快了吧,我之前也碰到过类似问题 我的解决方法是,把线程运行的结果保存到一个全局变量 再用一个定时类去显示这个全局变量,显示的频率自己看情况调了,显示更新太快也没用,人眼又来不及看
我是那个GetMessage()http访问的方法,耗时太久,对多线程不了解,你说的线程太快是什么情况?
人生导师 2013-08-12
  • 打赏
  • 举报
回复
直接使用BackgroundWorker这个控件,具体参考:http://www.cnblogs.com/zhili/archive/2013/05/11/EAP.html
szj820 2013-08-12
  • 打赏
  • 举报
回复
线程太快了吧,我之前也碰到过类似问题 我的解决方法是,把线程运行的结果保存到一个全局变量 再用一个定时类去显示这个全局变量,显示的频率自己看情况调了,显示更新太快也没用,人眼又来不及看
rtdb 2013-08-12
  • 打赏
  • 举报
回复
1 不要在线程里更新UI 2 线程写LOG文件以方便测试
andyliuxiaobo 2013-08-12
  • 打赏
  • 举报
回复
引用
异步通知,修改控件就不会出现假死了。
我的getMessage方法是用委托的方式通知ui,弹出MessageBox的

public void getMessage()
        {
            while (true)
            {
                //Application.DoEvents();
               {
                    BunnTools.FilesTool.WriteToFile(Application.StartupPath + "\\Applog.log", "消息记录:" + Environment.NewLine + DateTime.Now + "  " + "执行一次   " + GetMeg.GetApartmentState().ToString(), false);
                    string message = GetMessage();

                    if (this.Messagage != null)
                    {
                        this.Messagage((message));
                    }
                }
            }
        }
现在我的GetMessage();这个方式是访问http的,很耗时,我就修改成了现在的多线程循环调用,得到返回信息,委托传递给主线程,是不是我的思路就有问题呢?
feiniao19830822 2013-08-12
  • 打赏
  • 举报
回复
你贴出的代码是没问题的,不会导致UI假死,你最好把getMessage函数贴出来,估计问题在这里。 目测可能存在的问题: 1.getMessage循环获取数据时没有加sleep 2."通知主线程更新数据"这里有问题
PrivateBoy 2013-08-12
  • 打赏
  • 举报
回复
异步通知,修改控件就不会出现假死了。

110,533

社区成员

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

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

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