C# BackgroundWorker已完成,即使方法尚未完成

C# BackgroundWorker已完成,即使方法尚未完成,c#,asynchronous,backgroundworker,C#,Asynchronous,Backgroundworker,这里有人能查一下我的密码吗 方法还没有完成对事物的处理 但是后台工作人员已经完成了这个过程 bg.DoWork += Bg_DoWork; bg.RunWorkerCompleted += (object ss, RunWorkerCompletedEventArgs ee) => { _sysLog("Successfully uploaded.", Color.Green);

这里有人能查一下我的密码吗

方法还没有完成对事物的处理

但是后台工作人员已经完成了这个过程

        bg.DoWork += Bg_DoWork;

        bg.RunWorkerCompleted += (object ss, RunWorkerCompletedEventArgs ee) =>
        {
            _sysLog("Successfully uploaded.", Color.Green);              
        };

        bg.RunWorkerAsync();

背景工人做这项工作

    private void Bg_DoWork(object sender, DoWorkEventArgs e)
    {           
        var files = Folder.GetFileToPublicFolder(Folder.srcFolder);

        foreach (var chunk in files.Split(10))
        {
            foreach (var item in chunk)
            {
                File.Move(Path.Combine(Folder.srcFolder, item.Name), Path.Combine(Folder.tmpFolder, item.Name));
            }

            ProcessParallelThread(e);
        }

    }

并行线程将处理公用文件夹中的所有文件

    private void ProcessParallelThread(DoWorkEventArgs e)
    {
        object LockObject = new object();

        var Files = Folder.GetFileToPublicFolder(Folder.tmpFolder);

        Parallel.ForEach(Files, new ParallelOptions { MaxDegreeOfParallelism = 10 }, xFile =>
        {
            lock (LockObject)
            {
                bg.ReportProgress(0, Thread.CurrentThread.ManagedThreadId + " :(" + xFile + ") : Started ");
            }
            try
            {
                UploadFile(xFile);

                Thread.Sleep(1000);

                lock (LockObject)
                {
                    bg.ReportProgress(0, Thread.CurrentThread.ManagedThreadId + " :(" + xFile + ") : Ended =>>");
                }
            }
            catch (Exception)
            {
                bg.ReportProgress(0, Thread.CurrentThread.ManagedThreadId + " :(" + xFile + ") : Error X___X");

            }
        });
    }

此上载文件将根据需要执行的线程数进行处理

    private void UploadFile(FileInfo file)
    {
        var slicePDF = new PDFSplitter();

        var pdf = slicePDF.SplitPdf(file);

        var poExist = new POProcess();

        if (poExist.checkPO(pdf.pono).Result)
        {
            bg.ReportProgress(0, Thread.CurrentThread.ManagedThreadId + " :(" + file.Name + ") : File Exist X___X");

            File.Delete(Folder.tmpFolder + "\\" + file.Name);

        }
        else
        {
            var processPDF = new FTPProcess();

            var link = processPDF.uploadPDF(Folder.tmpFolder + "\\" + file.Name, pdf.sid).Result;

            if (link == "Error")
            {
                bg.ReportProgress(0, Thread.CurrentThread.ManagedThreadId + " :(" + file.Name + ") : Link Error X___X");

                MoveToErrFolder(file);
            }
            else
            {
                var po = new PO();

                po.sid = pdf.sid;
                po.pono = pdf.pono;
                po.region = pdf.region;
                po.location = pdf.location;
                po.division = pdf.division;
                po.link = link;
                po.filestatus = "Available";
                po.released = DateTime.Now;
                po.expiration = DateTime.Now.AddDays(7);
                po.isExpired = "no";

                if (poExist.addPO(po).Result)
                {
                    bg.ReportProgress(0, Thread.CurrentThread.ManagedThreadId + " :(" + file.Name + ") : Success");

                    Folder.CreateBackFolder(Folder.bckFolderPath);

                    File.Move(Folder.tmpFolder + "\\" + file.Name, Folder.bckFolderPath + "\\" + file.Name);

                }
                else
                {
                    bg.ReportProgress(0, Thread.CurrentThread.ManagedThreadId + " :(" + file.Name + ") : Error in Database X___X");

                    MoveToErrFolder(file);

                }                    
            }
        }
    }
提前谢谢你

后台工作程序的“工作”在执行“DoWork”方法的所有代码时结束

在这段代码中,执行另一个线程,该线程将异步执行“DoWork”方法

因此,您可以:

1) 删除内部线程,后台工作已在中执行 另一个线程尊重第一个线程


2) 转换任务中的内部线程并等待它。

我认为方法
ProcessParallelThread
在所有线程都以
并行方式启动之前不会结束。ForEach
将完成,所以这没有问题

…但可能您的其他一些方法,如
MoveToErrFolder
等是异步的,如果是这样,那么这就是问题所在


我没有看到BackgroundWorker初始化部分,但它是否已将
WorkerReportsProgress
设置为true?-
ReportProgress
调用所需的

您的RunWorkerCompleted事件处理程序有一个严重错误,它没有检查e.Error属性。必需。@HansPassant你是什么意思?现在你不知道如果工人失败了,你不能抓住一切。所以,当这种情况没有发生时,您将记录“成功上传”。@HansPassant yea!您在
BackgroundWorker
中是对的。但我在并行程序中发现了错误。Foreach未理解您所说的内容。。谢谢是的。一些方法,如
poExist.checkPO(pdf.pono).Result
processPDF.uploadPDF(Folder.tmpFolder+“\\\”+file.Name,pdf.sid)。Result
都是异步的。如果
poExist.checkPO(pdf.pono)
processPDF.uploadPDF(Folder.tmpFolder+“\\”+file.Name,pdf.sid)
将失败怎么办?它们也可能被取消。你也应该照顾好它。如果出现任何异常,RunWorkerCompleted仍将被触发。是的,如果这两个进程都失败了,我怎么才能发现这一点,比如,
checkpo
遇到连接问题,以及
uploadpdf
无法在FTP上连接。好吧,如果你正在使用任务-熟悉使用wait/async之类的东西。将其与后台工作人员混合。。。我不认为这是一个好主意-很难发现发生了什么,尤其是当你同时使用它的时候。也许是时候改变方法了——看看这个