相关疑难解决方法(0)

使用SynchronizationContext将事件发送回WinForms或WPF的UI

我正在使用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)

.net wpf multithreading synchronizationcontext

11
推荐指数
1
解决办法
2万
查看次数

我的表单加载时可以冻结我的UI渲染吗?

有什么办法可以暂停Winforms中的所有UI Update命令吗?

或者我有一种轻微的感觉,我试图以完全错误的方式解决这个问题,所以我的问题是另一种解决方法:我基本上加载一个控件的保存状态,它会在其上加载新的控件.但是我在UI线程中执行了一些操作,并且从另一个线程加载了一些数据,然后填充了UI.

因此,加载时的效果是用户可以看到一些控件出现在一个位置,然后移动到窗体上的另一个位置,更改值等.

我想要一个加载屏幕而不是这个并在后台加载控件.这是一个相当大的应用程序,它并不重要,所以重新设计我的代码并不是一个真正的选择.

我可以在方法执行时简单地停止控件上的所有Update()命令吗?

c# winforms

11
推荐指数
1
解决办法
8925
查看次数

尝试/最后阻止vs调用dispose?

这两个代码示例之间是否有任何区别,如果没有,为什么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块确实不会花费太多精力.我知道整个事情可能包含在一个更大的尝试块中但是,对我来说似乎是多余的.

c# dispose using try-catch streamwriter

8
推荐指数
3
解决办法
9644
查看次数

SuspendLayout/ResumeLayout是否毫无价值,还是我错了?

我有两个托管TableLayoutPanels的标签页,我用标签和文本框动态填充.第一个获得96个标签和96个文本框,其闪烁是可接受/可容忍的,所以我没有费心添加SuspendLayout/ResumeLayout对.

然而,第二个获得96个标签和288个文本框,其绘画/闪烁是无法容忍的.IOW,192个控件似乎没问题,但384肯定不行.

我在动态创建控件之前调用SuspendLayout,然后在finally块中调用ResumeLayout,但删除了它们,瞧!像第一个tabPage/TLP一样,闪烁是可以接受的.

为什么减法加法有效呢?

c# tabs dynamic tablelayoutpanel winforms

2
推荐指数
1
解决办法
7204
查看次数