工作者线程给UI如何用delegate
各位大虾:
你们好,小弟刚用VC#不久,改写以前VC的程序,对于异步SOCKET接受到数据包之后处理发生了问题,请指教。
具体问题是:
异步接收回调函数
public void OnDataReceived(IAsyncResult ar)
{
收到数据包。
应用程序处理函数 MessageProcess(byte []);
}
public void MessageProcess(byte[])
{
case a:
.....
break;
case b:
.....
break;
.....................//包括给好多窗口分发
}
但是在编译的时候提示说线程交叉,怎么解决,用delegate能解决吗?。我又没用多线程,我想应该时异步socket用了,请大侠帮助,最好给出例子,多谢多谢。
有位大虾回复:
在C#下面工作者线程给窗体传递消息可以用委托和Windows消息!
我用了委托,还是提示线程交叉,难道界面的每个控件的操作都要用control.invoke()那样程序也太复杂了.
能告诉我这种情况下怎样用委托?
------解决方案--------------------RouteSynchronizer routeSynchronizer = new RouteSynchronizer(tskMgr);
routeSynchronizer.SynchronizeComplete += new RouteSynchronizerEventHandler(RouteSynchronizer_SynchronizeComplete);
Thread thread = new Thread(routeSynchronizer.Synchronize);
thread.IsBackground = true;
thread.Start();
private void RouteSynchronizer_SynchronizeComplete(RouteSynchronizer synchronizer)
{
if (this.InvokeRequired)
{
this.Invoke(new InvokeDelegate <RouteSynchronizer> (RouteSynchronizer_SynchronizeComplete), synchronizer);
}
else
{
//处理
}
}
public delegate void RouteSynchronizerEventHandler(RouteSynchronizer synchronizer);
public class RouteSynchronizer
{
private TaskManager taskMgr;
public RouteSynchronizer(TaskManager taskMgr)
{
this.taskMgr = taskMgr;
}
private RouteSynchronizerEventHandler synchronizeComplete;
public event RouteSynchronizerEventHandler SynchronizeComplete
{
add { synchronizeComplete += value; }
remove { synchronizeComplete -= value; }
}
private void OnSynchronizeComplete()
{
if (synchronizeComplete != null)
synchronizeComplete(this);
}
public void Synchronize()
{
if (!Synchronizing)
return;
TaskManager.Route.LastSynchronize = DateTime.Now;
try
{
SynchronizeRoute(taskMgr.Route);
}
catch (Exception ex)
{
OnExceptionOccur(ex);
System.Diagnostics.Debug.WriteLine(ex.Message);
}
finally
{
OnSynchronizeComplete();
}
}
}