delegate void ShowMessageHandler(string message);//要跨线程调用的代理 class UIForm : Form { public void ShowMessage(string message) { if(this.InvokeRequired) { this.BeginInvoke(UI, message)//强烈建议不要用this.Invoke,N多项目总结,在这里实现跨线程 } else { this.Text = message;//假设这就是你的应用 } } }class Worker { public void WorkFunc(object state) { UIForm ui = state as UIForm; while(ContinueFlag)// a bool flag which enable the work thread alive { // do something ui.ShowMessage("hello csdn"); // do something else } } }
class UIForm : Form
{
public void ShowMessage(string message)
{
if(this.InvokeRequired)
{
this.BeginInvoke(UI, message)//强烈建议不要用this.Invoke,N多项目总结,在这里实现跨线程
}
else
{
this.Text = message;//假设这就是你的应用
}
}
}class Worker
{
public void WorkFunc(object state)
{
UIForm ui = state as UIForm;
while(ContinueFlag)// a bool flag which enable the work thread alive
{
// do something
ui.ShowMessage("hello csdn");
// do something else
}
}
}
所有的工作都是Worker在做,你发现没?而实际需要“Working”和“Show”在不同的线程中完成,以分解工作负荷。
那用SendMessage.重写WndProc,用SendMessage通过句柄发送自定义消息,然后在WndProc里面处理.
只是要设置下,control的允许其它线程操作
就在b结束的时候启动a就可以了,要通信干么
即使要通信,如果不是启动a线程,
非要通过参数来控制,那就不是即时了,要用sleep,要用循环
当参数正确的时候a执行。
如果都在B线程中调去调来的,那岂不是所有的事情都让B线程做了,那我们还要多线程来干嘛呢?如果你的程序做大了,你就会明白,多线程是可以提高性能的,虽然增加了线程之间通信的开销,但是总的来说是提高了性能。我现在明白怎么做了!还是采用消息机制。贴出一些代码来,以享大家:发送:
public IntPtr hdlWnd; // 窗口句柄
...
hdlWnd = this.Handle;
... SendMessage(hdlWnd, WM_Fin, IntPtr.Zero, para.ToString());接受:
//
// 摘要:
// A线程消息处理
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_Lbutton:
///string与MFC中的CString的Format函数的使用方法有所不同
//string message = string.Format("收到消息!参数为:{0},{1}", m.wParam, m.lParam);
//MessageBox.Show(message);///显示一个消息框
break; case WM_Fin:
TestFunc(Marshal.PtrToStringAnsi(m.LParam));
break; default:
base.DefWndProc(ref m);///调用基类函数处理非自定义消息。
break;
}
}
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
int lParam // second message parameter
);
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(
IntPtr hwnd,
int wMsg,
IntPtr wParam,
string lParam
);
What's it ? Could you please offer an example ?
貌似事件不行吧?或者异步代理可以达到要求
在.net 1.1的时候曾经是这么搞的,但这会发生令人郁闷的死锁和其他一些意外的事情,而且还不一定是小概率事件
这个就不说啥了,嘿,有时候还就得用多线程
这个可以,但只适合工作线程向主线程传递数据(消息循环只存在于主线程上),而且传递的数据量很有限
工作线程向主线程传递大量数据的时候还是需要通过delegate进行跨线程操作(微软官方推荐)
工作线程和工作线程之间的数据传递则需要同步互斥机制
remoting是设计用于局域网类似环境的RPC的,效率不高,而线程通信代价本应是非常非常低廉的,托管线程更是这样的