编辑:通过添加缺少进度更改事件处理程序解决。
我正在将一个WPF VB.net应用程序移植到C#,并且遇到了在不同类中具有DoWork方法的后台工作程序的问题。我怀疑我没有正确地投射后台工作者,或者我可能需要一个处理程序?
vb示例代码工作正常,进度条正确显示,C#代码似乎触发了bw.RunWorkerAsync();报告为IsBusy = True的方法,但没有其他响应,进度或对外部类的调用(据我所知)。
这是一个WPF应用程序,问题在于Usercontrol试图从控件之外的公共类报告进度。
如果有人能指出我正确的方向,我会非常感激。
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
答案 0 :(得分:0)
通过添加缺少的背景信息ProgressChanged事件处理程序解决。