我已经创建了一个背景工人。我的工作很棒...直到我不得不再次运行。好像CancelAsync不是立即的,我必须等待。
这是我的工作流程,以帮助您了解我在做什么。
- 打开文件
- 创建一个具有我的背景工作逻辑的对象。它做一堆东西并写一个文件。工人应立即结束,关闭或自我破坏。大声笑
- 在没有发生任何错误的情况下不执行任何操作后立即重复。但是,我目睹的行为是,如果我等待大约10秒钟并打开一个新文件来处理它。它只是不喜欢做正确的方法。
来自我的主要形式。
private void Button_Click(object sender, RoutedEventArgs e)
{
File_Worker myWorker = new File_Worker();
}
这是我的类
namespace Market.BI.Workers
{
class File_Worker
{
private BackgroundWorker worker = new BackgroundWorker();
void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Stuff
}
void Worker_DoWork(object sender, DoWorkEventArgs e)
{
var myItems = new List<Part>();
_CSV_Path = "somefile.csv";
var counter = 1;
var lineCount = File.ReadLines(e.Argument.ToString()).Count();
using (StreamReader reader = new StreamReader((string)e.Argument))
{
while (true)
{
string line = reader.ReadLine();
if (line == null)
{
break;
}
String value = line;
int startIndex = 0;
int length = 9;
String substring = value.Substring(startIndex, length);
if (substring == "UDI")
{
myItems.Add(new Part(line)); <<Part is a structured Class
}
((BackgroundWorker)sender).ReportProgress(counter * 100 / lineCount);
counter = counter + 1;
}
reader.Close();
}
}
e.Result = myItems;
}
void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Stuff
worker.CancelAsync();
}
//Method
public File_Worker()
{
worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(Worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.RunWorkerAsync();
fileProgressBar.IsIndeterminate = false;
}
}
}
您是正确的。CancelAsync不一定立即完成,您可以检查取消限额是否设置为true。如果e.cancelled比true并重新启动工作。
对于那些试图帮助我解决这个问题的人,谢谢。我不确定我要准确地回答这个问题。我决定采用另一种方法来使用TPL来解决我的问题。通过创建一个线程,我可以完成确切的合理,包括更新我的进度栏。
如果这可以帮助任何人,这里有一些片段。
var ptx = new Task(() => DoWork(myWorker, fileProgressBar, gridPartEdgeDetails));
myWorker.file_Path = filePath;
ptx.Start();
static void DoWork(CVS_Worker x, ProgressBar pb, DataGrid dg)
{
var parts = new List<Part>();
parts = x.DoMyStuff(pb); //pass in my progressbar
//Update Datagrid
dg.Dispatcher.Invoke(() =>
{
dg.ItemsSource = parts;
});
}
和我的cvs_worker类内部,我从那里调用了我的状态栏。最后,编码更简单,我可以在没有任何问题的情况下启动此过程多次。
pb.Dispatcher.Invoke(() =>
{
pb.Value = (counter * 100 / lineCount);
});