所以我有一个类在新的后台工作程序中启动一个新类,后台工作程序使用progresschanged部分传回状态消息。
当我尝试并通过输入
来使用它时classname.Dataworker.reportprogress(5)
从单独的类中我得到一个错误,我在定义之前使用了一个对象。
我发现的例子都使用了单个类和不同的函数。
这可能是一个愚蠢的错误,但我只是看不到它,谢谢你能给予的任何帮助!
我的代码的一般概述是:
//form class
public static BackgroundWorker bw = new BackgroundWorker();
onbuttonclick
{
installer install = new installer();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += class2.aFunction;
bw.ProgressChanged += new ProgressChangedEventHandler(mainForm_InstallerEvent);
bw.RunWorkerAsync();
}
private void mainForm_InstallerEvent(object sender, ProgressChangedEventArgs e)
{
lbl.Text = e.UserState.ToString();
}
//// class2后台工人类
aFunction
{
InstallerForm.bw.ReportProgress(5); //errors on this!
}
答案 0 :(得分:6)
如果您想要执行以下操作,则需要使用UserState调用ReportProgress:
lbl.Text = e.UserState.ToString();
然后你的电话会是这样的:
aFunction
{
InstallerForm.bw.ReportProgress(5, "5% Complete");
}
现在看起来你的e.UserState将为null,并且调用ToString()将导致空引用异常。
Here是UserState是文本的示例。
答案 1 :(得分:1)
感谢您的帮助,在我找到的答案和答案之间我已经设法让它工作了,我错过的一行是: BackgroundWorker worker =(BackgroundWorker)sender;
然后引用该worker对象 worker.reportprogress(..)
我觉得有用的指南是:http://www.nerdparadise.com/tech/coding/csharp/backgroundworker/
完美,谢谢你们:)
答案 2 :(得分:0)
后台工作线程使用ReportProgress将百分比值传递给Progress_Changed委托。这个article显示了同步和异步的示例。
答案 3 :(得分:0)
到目前为止,这是我的 lazy 解决方法(因为我不想使用额外的事件处理程序)。那时我也不想理解userstate
;)所以我使用了包含特定长操作的所有警报/消息的列表。消息字符串保存在应用程序内强大的资源存储库App.Properties.Settings
中。由于ReportProgress
采用整数,因此我将ReportProgress
中的列表索引发送到Progress_Changed
。
例如: 在do_work中调用了以下方法。
private void LongOperation()
{
try
{
//the operation
if (success){
//write a message to a status label
bgWorker.ReportProgress(1);
}
else{
//write a message to a status label
bgWorker.ReportProgress(2);
}
}
catch(){...}
}
public void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs p)
{
int lstIndex = p.ProgressPercentage;
lblStatus.Text = mssglist[lstIndex].ToString();
}