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之类的东西。将其与后台工作人员混合。。。我不认为这是一个好主意-很难发现发生了什么,尤其是当你同时使用它的时候。也许是时候改变方法了——看看这个