日期:2014-05-19  浏览次数:21050 次

工作者线程给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();
}
}
}