-1

編集:欠落している進行状況変更イベントハンドラーを追加することで解決しました。

WPF VB.net アプリケーションを C# に移植していますが、別のクラスに DoWork メソッドを持つバックグラウンド ワーカーに問題があります。バックグラウンド ワーカーを正しくキャストしていない疑いがありますか、それともハンドラーが必要ですか?

vb サンプル コードは正常に動作し、プログレス バーは適切に表示されます。C# コードは bw.RunWorkerAsync(); を起動するようです。メソッドは IsBusy=True として報告されますが、他の応答、進行状況、または外部クラスへの呼び出しはありません (私が知る限り)。

これは WPF アプリケーションであり、問​​題はユーザーコントロールがコントロール外のパブリック クラスから進行状況を報告しようとすることに関するものです。

誰かが私を正しい方向に向けることができれば、本当に感謝しています。

C# サンプル コード

 namespace testApp.Usercontrols
    public partial class ucHome : UserControl
    {
        public Sharing.clsDownloadCollection foo = new Sharing.clsDownloadCollection(); 
         BackgroundWorker bw = new BackgroundWorker();



     public ucHome()         
{       InitializeComponent();
 }

private void Button1_Click(object sender, RoutedEventArgs e)
    {


        bw.WorkerReportsProgress = true;
        pBar.Maximum = 50000;   //progress bar on ucHome
        pBar.Value = 0;

        **// Indicates IsBusy=True when debugging but can't see any further activity
         bw.RunWorkerAsync();
        //**

    }

 public void bw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
          var foo=new foo();

         // possible problem?
           foo.DoWork((BackgroundWorker)sender);

        }

        public void bw_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        {

            this.pBar.Value = e.ProgressPercentage;
        }

外部クラス別のプロジェクト フォルダー/名前空間

 namespace testApp.Sharing
{
//different namespace /folder than ucHome
 public class foo 

{
public void DoWork(BackgroundWorker bw)
{
    for (int i = 0; i <= 50000; i++) {
        i += 1;

        bw.ReportProgress(i - 1);
}
}

}

期待どおりに動作するサンプル VB コード。

    Public Class ucHome 'user control
Public foo As New foo
Friend WithEvents bw As New BackgroundWorker
Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
        bw.WorkerReportsProgress = True  
        pBar.Maximum = 50000
        pBar.Value = 0
        bw.RunWorkerAsync() 

    End Sub
    Private Sub bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
          'possible my C# is not casting correctly?
        foo.DoWork(DirectCast(sender, BackgroundWorker)) 

    End Sub

    Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bw.ProgressChanged
       Me.pBar.Value = e.ProgressPercentage
    End Sub

End Class

ユーザーコントロールが呼び出すクラス foo

Public Class foo

  Public Sub DoWork(ByVal bw As BackgroundWorker)
        For i As Integer = 0 To 50000
            i += 1
         bw.ReportProgress(i - 1)
        Next
    End Sub
End Class
4

1 に答える 1

0

欠落しているバックグラウンダーの ProgressChanged イベント ハンドラーを追加することで解決しました。

于 2012-07-24T05:07:50.730 に答える