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