我正在使用SynchronizationContext将事件编组回我的DLL中的UI线程,该线程执行许多多线程后台任务.
我知道单例模式不是最喜欢的,但是我现在用它来存储创建foo的父对象时UI的SynchronizationContext的引用.
public class Foo
{
public event EventHandler FooDoDoneEvent;
public void DoFoo()
{
//stuff
OnFooDoDone();
}
private void OnFooDoDone()
{
if (FooDoDoneEvent != null)
{
if (TheUISync.Instance.UISync != SynchronizationContext.Current)
{
TheUISync.Instance.UISync.Post(delegate { OnFooDoDone(); }, null);
}
else
{
FooDoDoneEvent(this, new EventArgs());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这在WPF中根本不起作用,TheUISync实例UI同步(从主窗口馈送)永远不会与当前的SynchronizationContext.Current匹配.在Windows窗体中,当我做同样的事情时,他们将在调用后匹配,我们将回到正确的线程.
我讨厌的修复,看起来像
public class Foo
{
public event EventHandler FooDoDoneEvent;
public void DoFoo()
{
//stuff
OnFooDoDone(false);
}
private void OnFooDoDone(bool invoked)
{
if (FooDoDoneEvent != null)
{
if ((TheUISync.Instance.UISync != SynchronizationContext.Current) && (!invoked))
{ …Run Code Online (Sandbox Code Playgroud) 有什么办法可以暂停Winforms中的所有UI Update命令吗?
或者我有一种轻微的感觉,我试图以完全错误的方式解决这个问题,所以我的问题是另一种解决方法:我基本上加载一个控件的保存状态,它会在其上加载新的控件.但是我在UI线程中执行了一些操作,并且从另一个线程加载了一些数据,然后填充了UI.
因此,加载时的效果是用户可以看到一些控件出现在一个位置,然后移动到窗体上的另一个位置,更改值等.
我想要一个加载屏幕而不是这个并在后台加载控件.这是一个相当大的应用程序,它并不重要,所以重新设计我的代码并不是一个真正的选择.
我可以在方法执行时简单地停止控件上的所有Update()命令吗?
这两个代码示例之间是否有任何区别,如果没有,为什么using存在?
StreamWriter writer;
try {
writer = new StreamWriter(...)
writer.blahblah();
} finally {
writer.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
VS:
using (Streamwriter writer = new Streamwriter(...)) {
writer.blahblah
}
Run Code Online (Sandbox Code Playgroud)
我的意思是在第二个例子中你真的应该把它放在try块中,所以添加finally块确实不会花费太多精力.我知道整个事情可能包含在一个更大的尝试块中但是,对我来说似乎是多余的.
我有两个托管TableLayoutPanels的标签页,我用标签和文本框动态填充.第一个获得96个标签和96个文本框,其闪烁是可接受/可容忍的,所以我没有费心添加SuspendLayout/ResumeLayout对.
然而,第二个获得96个标签和288个文本框,其绘画/闪烁是无法容忍的.IOW,192个控件似乎没问题,但384肯定不行.
我在动态创建控件之前调用SuspendLayout,然后在finally块中调用ResumeLayout,但删除了它们,瞧!像第一个tabPage/TLP一样,闪烁是可以接受的.
为什么减法加法有效呢?