2016-03-26 13 views
0

私のプログラムで何が間違っていますか?実行中のスレッドをUIから分離することはできません。スレッドの実行中にUIに到達することはできません。UIから別のスレッド

最初のオプション:

// on button click: 
this.CreateImageList(); 

private void CreateImageList() 
{ 
    this.images.Clear(); 

    ThreadStart threadStart = delegate 
    { 
     this.dispatcher.BeginInvoke(new ThreadStart(delegate 
     { 
      foreach (var filePath in this.fileBuffer) 
      { 
       var result = new ImageObject(filePath); 
       if (result.Image != null) 
       { 
        this.images.Add(result); 
        this.dispatcher.Invoke(() => this.StatusText = filePath, DispatcherPriority.Render); 
       } 
      } 

      this.RaisePropertyChanged("Images"); 
     })); 
    }; 

    var thread = new Thread(threadStart); 
    thread.IsBackground = true; 
    thread.Start(); 
} 

番目のオプション:最初に

// on button click: 
this.CreateImageList(); 

private async void CreateImageList() 
{ 
    await this.CreateImageListAsync(); 
} 

private async Task CreateImageListAsync() 
{ 
    this.images.Clear(); 
    var countTotal = this.fileBuffer.Count(); 
    var index = 0; 

    await Task.Run(() => this.dispatcher.Invoke(
    (() => 
    { 
     foreach (var filePath in this.fileBuffer) 
     { 
      var result = new ImageObject(filePath); 
      if (result.Image != null) 
      { 
       this.images.Add(result); 

       var percent = (index * 100)/countTotal; 
       this.DoForce(() => this.StatusText = percent + "% " + filePath); 
      } 

      index++; 
     } 

     this.RaisePropertyChanged("Images"); 
    }), DispatcherPriority.SystemIdle)); 
} 

public void DoForce(Action action) 
{ 
    this.dispatcher.Invoke(DispatcherPriority.Render, action); 
} 

、プログラムが作業を行う第二の選択肢で

は、これは私のviewmodelです。しかし、第一及び第二のオプションではUIを使用して、とにかく(非応答性のUIを生じる)UIスレッド上でそれを実行するUIディスパッチャにデリゲートを入れているので、これはユーザー

+0

実際にどのようなエラーが表示されるのですか?あなたが見たものの解釈ではなく、正確な誤りの観察を提供してください! –

+3

これは、UIディスパッチャ自体にデリゲートを配置しているためです。あなたはUIディスパッチャーでUIタスクだけを委譲し、残りはバックグラウンドスレッド上で実行することができます。 –

+0

エラーはありません!プログラムは正常に動作します!しかし、私は窓を移動することはできません、またはボタンをクリックしてください。 – peter70

答えて

4

のために到達することはできません。

UIディスパッチャーでUIタスクのみを委任する必要があります。休憩はバックグラウンドスレッドで実行できます。

+3

を実行する場合は、async/awaitパターンを使用するか、「タスク」タイプを使用することをお勧めします。ありがとうございました! – peter70

0

私は、バックグラウンドスレッドでもUIスレッドでも、別スレッドがメインスレッド(ProgressChangedを除く)にアクセスできないという印象を受けています。私はこの問題に多くの時間を費やし、私は永続的にセカンダリスレッドからメインスレッドにアクセスする方法を見つけることができませんでした。

私のUIスレッドの解決策は、拡張(lParam)値および/またはレジストリ値と一緒にスレッド間でチャットするためにWndProcを使用していました。

バックグラウンドワーカースレッドでは、メインスレッドへのウィンドウプロパティポインタを通じてprogressイベントのメインスレッドにアクセスしました。メインスレッドは、BgWorker内のProgressChangedイベントからのみアクセスできます。

関連する問題