Dan*_*lba 9 .net c# multithreading winforms
我正在控制加载数据时显示动画.线程完成后,我隐藏动画并显示控件.所以我从一个线程执行这个代码:
protected void InvokeEnableBackControl()
{
if (this.InvokeRequired)
{
this.Invoke(new OpHandler(EnableBackControl));
}
else
{
EnableBackControl();
}
}
Run Code Online (Sandbox Code Playgroud)
有时,当我执行此代码时,主线程在以下代码中被挂起:
protected virtual void EnableBackControl()
{
if (overlayAnimation.TargetControl != null)
{
overlayAnimation.TargetControl.BringToFront();
}
overlayAnimation.SendToBack();
overlayAnimation.Enabled = false;
overlayAnimation.Visible = false;
Run Code Online (Sandbox Code Playgroud)
}
我不确定它是否被绞死设置Enable或Visible属性.您是否知道任何可能会将应用程序调用这些属性的情况Control.Invoke?
ben*_*sai 17
注意Control.Invoke是同步的,所以它会等待EnableBackControl()返回.考虑使用Control.BeginInvoke,你可以"发射并忘记".
看到这个答案:Invoke()和BeginInvoke()之间有什么区别
我在执行之前遇到了问题.当我的主线程仍然忙时,在后台线程上调用 - 这给人的印象是应用程序挂起,因为.Invoke只是坐在那里,等待主线程到回应它正在关注.可能的原因:
当您附加调试器时,请特别注意您的主控制MessagePump线程正在做什么 - 我怀疑它缺乏关注是您的麻烦的原因.如果你发现它是主线程中没有响应的紧密循环,请尝试.DoEvents在循环中插入一个,这将暂停执行并强制主线程清空消息泵并路由任何未完成的请求.
| 归档时间: |
|
| 查看次数: |
14752 次 |
| 最近记录: |