但是在遇到并发信息特别大时,这个主程序中的事件处理就成为了瓶颈,容易造成界面无响应的情况。
现在考虑将主程序中的事件响应放到线程中去处理,不知道这个想法对不对?还有就是该怎样处理跟合理?我才学C#一个多月,对很多多线程的处理没有设计上的逻辑,还望大家多多指教,谢谢大家了。
下面是部分代码:
private void ServerForm_Load(object sender, EventArgs e)
{
……
this.Server.ConnectionOvertime += new ConnectionOvertimeDelegate(Server_ConnectionOvertime);//注册超时事件
this.Server.ServerMessageHandler += new ServerMessageHandlerDelegate(Server_MessageHandler);//注册传输消息事件
this.Server.Start();
this.smp = new ServerMessageProcesser(this.Server);//初始化消息处理对象smp,smp负责传输消息事件的具体操作
……
}
7 个解决方案
#1
1.使用多线程最好的前提就是看资源使用情况,比如说我同时操作多个word,就可以开多线程。但是如果我同时对一个Word操作不同部分,实际上也可以,但是处理起来相当繁琐。
2.其实你这种情况可以考虑为你的事件响应开一个后台线程(可以使用BackGroundWorker)
一下可以写在你的事件响应函数里:
Backgroundworker worker =new Backgroundworker();
worker.DoWork+=new DoWorkEventHandler((sender,e)=>
{
//ToDo
//界面提示数据处理中...
//后台加载数据
});
worker.ProgressChanged+= new ProgressChangedEventHandler((sender,e)=>
{
//ToDo
});
worker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler((sender,e)=>
{
//数据已加载完毕
});
3.剩下的看你的应用场景是否符合多线程
2.其实你这种情况可以考虑为你的事件响应开一个后台线程(可以使用BackGroundWorker)
一下可以写在你的事件响应函数里:
Backgroundworker worker =new Backgroundworker();
worker.DoWork+=new DoWorkEventHandler((sender,e)=>
{
//ToDo
//界面提示数据处理中...
//后台加载数据
});
worker.ProgressChanged+= new ProgressChangedEventHandler((sender,e)=>
{
//ToDo
});
worker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler((sender,e)=>
{
//数据已加载完毕
});
3.剩下的看你的应用场景是否符合多线程
#2
后台线程可以帮你解决界面无响应的问题
#3
我现在是这样处理的,新建了一个字段
private Thread eventProcessThread = null;
,在主程序中不注册事件了,注册事件的语句移到了线程eventProcessThread的处理函数中去。
private void EventProcessThreadMethod()
{
this.Server.ConnectionOvertime += new ConnectionOvertimeDelegate(Server_ConnectionOvertime);
this.Server.ServerMessageHandler += new ServerMessageHandlerDelegate(Server_MessageHandler);
}
然后在
private void ServerForm_Load(object sender, EventArgs e)
{
……
eventProcessThread = new Thread(EventProcessThreadMethod);
eventProcessThread.Start();
this.Server.Start();
this.smp = new ServerMessageProcesser(this.Server);//初始化消息处理对象smp,smp负责传输消息事件的具体操作
……
}
我不知道这样的处理是否规范,或者说这样的处理是否将以前的事件处理全部移到了后台线程里面去处理了呢?还望高手指点
private Thread eventProcessThread = null;
,在主程序中不注册事件了,注册事件的语句移到了线程eventProcessThread的处理函数中去。
private void EventProcessThreadMethod()
{
this.Server.ConnectionOvertime += new ConnectionOvertimeDelegate(Server_ConnectionOvertime);
this.Server.ServerMessageHandler += new ServerMessageHandlerDelegate(Server_MessageHandler);
}
然后在
private void ServerForm_Load(object sender, EventArgs e)
{
……
eventProcessThread = new Thread(EventProcessThreadMethod);
eventProcessThread.Start();
this.Server.Start();
this.smp = new ServerMessageProcesser(this.Server);//初始化消息处理对象smp,smp负责传输消息事件的具体操作
……
}
我不知道这样的处理是否规范,或者说这样的处理是否将以前的事件处理全部移到了后台线程里面去处理了呢?还望高手指点
#4
还要个问题就是,调试的时候能查看到是那个线程在调用函数处理吗?
#5
public bool isStopThread
#6
谁来看看啊,这个该怎么处理啊?我上面的处理方法是错误的
#7
应该没有转移事件处理。事件本身的执行流程是在主线程执行到事件触发点时,跳转到你注册的函数执行,再跳转回来。始终是同一线程,与你在哪个线程注册没有关系。建议你研究BackGroundWorker,可以让注册的函数在后台执行,主线程保证有响应。
#1
1.使用多线程最好的前提就是看资源使用情况,比如说我同时操作多个word,就可以开多线程。但是如果我同时对一个Word操作不同部分,实际上也可以,但是处理起来相当繁琐。
2.其实你这种情况可以考虑为你的事件响应开一个后台线程(可以使用BackGroundWorker)
一下可以写在你的事件响应函数里:
Backgroundworker worker =new Backgroundworker();
worker.DoWork+=new DoWorkEventHandler((sender,e)=>
{
//ToDo
//界面提示数据处理中...
//后台加载数据
});
worker.ProgressChanged+= new ProgressChangedEventHandler((sender,e)=>
{
//ToDo
});
worker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler((sender,e)=>
{
//数据已加载完毕
});
3.剩下的看你的应用场景是否符合多线程
2.其实你这种情况可以考虑为你的事件响应开一个后台线程(可以使用BackGroundWorker)
一下可以写在你的事件响应函数里:
Backgroundworker worker =new Backgroundworker();
worker.DoWork+=new DoWorkEventHandler((sender,e)=>
{
//ToDo
//界面提示数据处理中...
//后台加载数据
});
worker.ProgressChanged+= new ProgressChangedEventHandler((sender,e)=>
{
//ToDo
});
worker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler((sender,e)=>
{
//数据已加载完毕
});
3.剩下的看你的应用场景是否符合多线程
#2
后台线程可以帮你解决界面无响应的问题
#3
我现在是这样处理的,新建了一个字段
private Thread eventProcessThread = null;
,在主程序中不注册事件了,注册事件的语句移到了线程eventProcessThread的处理函数中去。
private void EventProcessThreadMethod()
{
this.Server.ConnectionOvertime += new ConnectionOvertimeDelegate(Server_ConnectionOvertime);
this.Server.ServerMessageHandler += new ServerMessageHandlerDelegate(Server_MessageHandler);
}
然后在
private void ServerForm_Load(object sender, EventArgs e)
{
……
eventProcessThread = new Thread(EventProcessThreadMethod);
eventProcessThread.Start();
this.Server.Start();
this.smp = new ServerMessageProcesser(this.Server);//初始化消息处理对象smp,smp负责传输消息事件的具体操作
……
}
我不知道这样的处理是否规范,或者说这样的处理是否将以前的事件处理全部移到了后台线程里面去处理了呢?还望高手指点
private Thread eventProcessThread = null;
,在主程序中不注册事件了,注册事件的语句移到了线程eventProcessThread的处理函数中去。
private void EventProcessThreadMethod()
{
this.Server.ConnectionOvertime += new ConnectionOvertimeDelegate(Server_ConnectionOvertime);
this.Server.ServerMessageHandler += new ServerMessageHandlerDelegate(Server_MessageHandler);
}
然后在
private void ServerForm_Load(object sender, EventArgs e)
{
……
eventProcessThread = new Thread(EventProcessThreadMethod);
eventProcessThread.Start();
this.Server.Start();
this.smp = new ServerMessageProcesser(this.Server);//初始化消息处理对象smp,smp负责传输消息事件的具体操作
……
}
我不知道这样的处理是否规范,或者说这样的处理是否将以前的事件处理全部移到了后台线程里面去处理了呢?还望高手指点
#4
还要个问题就是,调试的时候能查看到是那个线程在调用函数处理吗?
#5
public bool isStopThread
#6
谁来看看啊,这个该怎么处理啊?我上面的处理方法是错误的
#7
应该没有转移事件处理。事件本身的执行流程是在主线程执行到事件触发点时,跳转到你注册的函数执行,再跳转回来。始终是同一线程,与你在哪个线程注册没有关系。建议你研究BackGroundWorker,可以让注册的函数在后台执行,主线程保证有响应。