跨线程事件问题

ares1986 2011-05-25 10:46:37

/// <summary>
/// 异步回零点
/// </summary>
/// <returns></returns>
public virtual bool AsynGoHome()
{
if (IsLinked == false)
return false;
ThreadPool.QueueUserWorkItem(
delegate(object obj)
{
GoHomeResult res = GoHome();
OnAsynGoHomeCompleted(res);
});
return true;
}
/// <summary>
/// 异步回零完成事件
/// </summary>
public event EventHandler AsynGoHomeCompleted;
protected void OnAsynGoHomeCompleted(GoHomeResult result)
{
if (AsynGoHomeCompleted != null)
{
this.AsynGoHomeCompleted(this, new AsynGoHomeCompletedEventArgs(result));
}
}

请问这个事件AsynGoHomeCompleted如何写才能让窗口响应的时候不用使用Invoke函数来操作控件



...全文
140 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ares1986 2011-05-27
  • 打赏
  • 举报
回复
没的人,结贴了
ares1986 2011-05-25
  • 打赏
  • 举报
回复
我倒是想在OnAsynGoHomeCompleted里面写个Invoke调用代理,但是不知道Form,所以无法实现.
我想实现的效果是 在窗口中调用AsynGoHomeCompleted事件要像调用其他非线程的事件一样, 不用做任何处理
isjoe 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ares1986 的回复:]
C# code


private void MainForm_Load(object sender, EventArgs e)
{
_Worker = new SeparationWorker(panel_preview);
_Worker.Init();
_Worker.Mot……
[/Quote]

完成事件中,还需要Invoke吗?
ares1986 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fengyarongaa 的回复:]
C# code
Form.CheckForIllegalCrossThreadCalls = false;


允许 跨线程访问
[/Quote]
这样是可以,
但是我想尽量不让调用方更改设置,而由被调用方做处理,如在OnAsynGoHomeCompleted函数里面做一下处理,
有没有方法做到呢?
isjoe 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fengyarongaa 的回复:]
C# code
Form.CheckForIllegalCrossThreadCalls = false;


允许 跨线程访问
[/Quote]

放弃安全性。。。。。。。。。。
请叫我卷福 2011-05-25
  • 打赏
  • 举报
回复
非UI线程操作UI控件
ycproc 2011-05-25
  • 打赏
  • 举报
回复
Form.CheckForIllegalCrossThreadCalls = false;


允许 跨线程访问
ares1986 2011-05-25
  • 打赏
  • 举报
回复


private void MainForm_Load(object sender, EventArgs e)
{
_Worker = new SeparationWorker(panel_preview);
_Worker.Init();
_Worker.Motion.AsynGoHomeCompleted += new EventHandler(Motion_AsynGoHomeCompleted);
}

void Motion_AsynGoHomeCompleted(object sender, EventArgs e)
{
AsynGoHomeCompletedEventArgs ae=e as AsynGoHomeCompletedEventArgs;
this.Invoke((MethodInvoker)delegate{
this.label1.Text = ae.ToString();
});

}

我知道事件如何调用,我是想有没有方法解决不要每次调用事件都要加this.Invoke((MethodInvoker)delegate{
this.label1.Text = ae.ToString();
});
才能操作控件,使用起来比较麻烦
ghost5216 2011-05-25
  • 打赏
  • 举报
回复
就像这样
this.button1.Click += new System.EventHandler(this.button1_Click);
ghost5216 2011-05-25
  • 打赏
  • 举报
回复
窗口类 注册这个事件
ares1986 2011-05-25
  • 打赏
  • 举报
回复
没人啊,我都等得肚子饿了

110,499

社区成员

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

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

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