2011-12-15 4 views
2

ビューのコントロールにバインドされたデータであるモデルがあります。結合されたプロパティ(タイプBindingList<T>)の1つが別のスレッドから更新されます。 (TPLは、.NET 4.0)を以下のようにthis answerからの助けを借りてデータバインディング、マルチスレッド、ユニットテスト

は、私が「有効なクロススレッド操作ではない」問題をを解く:

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)のテスト彼らはエラーを投げた

現在のSynchronizationContextはTaskSchedulerとして使用できません。

ライン上

new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()); 

どのように私はエレガントに可能な限りこれを解決することができますか?

+2

NUnitを使用していますか? http://stackoverflow.com/questions/8245926/nunit-tests-the-current-synchronizationcontext-may-not-be-used-as-a-taskschedul –

+0

@LukeHutton - はい、NUnitです。私はあなたがその問題を見つけたと思う。それを回答として投稿したいかもしれません。 :)ありがとう! – TrueWill

答えて

3

SynchronizationContextを指定する必要があります。 参考:The current SynchronizationContext may not be used as a TaskScheduler

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

私はコンストラクタを介して私のモデルにTaskSchedulerを注入しました。私は 'TaskScheduler.FromCurrentSynchronizationContext()'を渡します。私は 'TaskScheduler.Current'を渡します。 – TrueWill

+1

更新:[.NET Frameworkによる並列プログラミングのサンプル](http://code.msdn.microsoft.com/ParExtSamples/Release/ProjectReleases.aspx)の 'CurrentThreadTaskScheduler'は、' TaskScheduler.Current'よりもテストの方が優れています。 – TrueWill

関連する問題