2012-12-20 139 views
2

我已经看过msdn以及有关如何使用后台工作人员的类似堆栈交换问题。基本上,我的函数上传程序做了实际的工作,但我想要一个线程来改变它的元素(进度条等),当我发送事件的进度改变。我试过的是以下(严厉编辑),它不起作用,并且在调用runworkerasync之后该程序似乎被切断。是否有一些简单的错误或将我的命令发送到另一个线程是错误的?另一个后台工作人员

BackgroundWorker backgroundUpload = new System.ComponentModel.BackgroundWorker(); 

第一位是呼叫:

 if (backgroundUpload.IsBusy != true) 
     { 
      backgroundUpload.RunWorkerAsync(work); 
       // a command here for debug purposes (eg a message box) will run 
     } 
     else 
     { //it doesn't go here, this isn't the error} 

然后DoWork的,它似乎永远不会来到这里。

private void backgroundUpload_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     e.Result = UploadProgram((Workload)e.Argument, worker, e); //workload is one of my enums 
    } 

似乎从来没有到过这里。

bool UploadProgram(Workload work, BackgroundWorker worker, DoWorkEventArgs e) 
    { 
    } 

    //also there is progress changed and run worker complete. 
+1

我猜你的电话,但你必须在DoWork的事件委托的减速?即backgroundUpload.DoWork + = 新的DoWorkEventHandler(UploadProgram); –

+0

那很简单。干得好,每个人都有不同的感受。 –

回答

2

在代码中缺少必要的管道,让一个BackgroundWorker与UI沟通

你需要确保这些属性和事件都设置正确

..... 
backgroundUpload.DoWork += backgroundUpload_DoWork 
backgroundUpload.ProgressChanged += backgroundUpload_ProgressChanged; 
backgroundUpload.WorkerReportsProgress = true; 
..... 

您需要在UI线程上运行的事件处理程序来更新进度栏

private void backgroundUpload_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar.Value = (e.ProgressPercentage.ToString() + "%"); 
} 

,并在您工作时上传文件

worker.ReportProgress(percentComplete); 
4

您是否订阅了事件处理函数?

BackgroundWorker backgroundUpload = new System.ComponentModel.BackgroundWorker(); 
backgroundUpload.DoWork += backgroundUpload_DoWork;