c# - 数据绑定(bind)、多线程和单元测试

标签 c# winforms multithreading unit-testing data-binding

我有一个将数据绑定(bind)到 View 中的控件的模型。绑定(bind)属性之一(类型 BindingList<T> )从另一个线程更新。

this answer 的帮助下,我解决了“跨线程操作无效”问题,如下(.NET 4.0,TPL):

public class Model : INotifyPropertyChanged
{
    private readonly TaskFactory _uiThreadTaskFactory =
        new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());

    private readonly object _myPropertyLocker = new object();

    private void Handler()
    {
        // In another thread

        _uiThreadTaskFactory.StartNew(
            () =>
                {
                    lock (_myPropertyLocker)
                    {
                        MyProperty.Add(someStuff);
                    }
                });
    }
}

这一直有效 - 直到我尝试在 ReSharper 的测试运行程序 (v5.1) 中运行单元测试。他们抛出了错误

The current SynchronizationContext may not be used as a TaskScheduler.

上线

new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());

我怎样才能尽可能优雅地解决这个问题?

最佳答案

您需要提供一个 SynchronizationContext。 引用: The current SynchronizationContext may not be used as a TaskScheduler .

[SetUp]
public void TestSetUp()
{
  SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
}

关于c# - 数据绑定(bind)、多线程和单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513548/

相关文章:

c# - 从 url 下载文件超时

c# - 如何制作 ToolStripComboBox 来填充 ToolStrip 上的所有可用空间?

c# - 在窗体上任意位置按键

java - 在 Android 上检测 ui 线程在哪里停滞的简单方法?

c# - 在 C# 中使用 BackgroundWorker?

c# - 在 Silverlight 的 Entity Framework 中将 Contains as 'IN' 条款与 LINQ 一起使用

c# - Range 对象中的 Min (5) 必须小于或等于 max (-1)?

c# - 如何在托管代码 (C#) 中从 native 代码 (C++) 获取字符串数组

c# - 将表单添加到流布局面板

java - Java 计划执行程序的未处理异常