课堂内的背景工人,我必须等待再次跑步

  • 本文关键字:等待 背景 课堂 c# .net wpf
  • 更新时间 :
  • 英文 :


我已经创建了一个背景工人。我的工作很棒...直到我不得不再次运行。好像CancelAsync不是立即的,我必须等待。

这是我的工作流程,以帮助您了解我在做什么。

  1. 打开文件
  2. 创建一个具有我的背景工作逻辑的对象。它做一堆东西并写一个文件。工人应立即结束,关闭或自我破坏。大声笑
  3. 在没有发生任何错误的情况下不执行任何操作后立即重复。但是,我目睹的行为是,如果我等待大约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);
});

最新更新