繁体   English   中英

如何中止/取消转发的BackgroundWorker?

[英]How can I abort/cancel the forwarded BackgroundWorker?

如您所见, 这里有一个ftp传输的后台工作人员。
弗兰克斯的答案显示了一个带有某些替代方法的新类,因此可以获取传输速度及其百分比。

我想取消运行上传的backgroundworker,但是我不知道如何。

履行

public UpAndDownloadForm(Job pJob)
    {
        InitializeComponent();
        this.job = pJob;
        bGroundWorker = new BackgroundWorker();
        bGroundWorker.WorkerReportsProgress = true;
        bGroundWorker.WorkerSupportsCancellation = true;

        bGroundWorker.DoWork += new DoWorkEventHandler(bGroundWorker_DoWork);
        bGroundWorker.ProgressChanged += new ProgressChangedEventHandler(bGroundWorker_ProgressChanged);
        bGroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bGroundWorker_RunWorkerCompleted);

        bGroundWorker.RunWorkerAsync(pJob);
    }

做工作:

void bGroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        streamWithTransferSpeedWorker = (BackgroundWorker)sender;
        Job job = (Job)e.Argument;
        string[] files = Directory.GetFiles(job.GetSourceFolder(), "*.*", SearchOption.AllDirectories);

        if (bGroundWorker.CancellationPending) //Falls der bGWorker abgebrochen wurde, beendet man diesen wohl einfach mit e.Cancel;
        {
            e.Cancel = true;
            return;
        }
        foreach (string file in files)
        {
            char[] temp = file.ToCharArray(); //Dateipfad in CharArray speichern
            Array.Reverse(temp); //Reihenfolge ändern (von hinten nach vorne)
            string fileReversed = new string(temp); //als string speichern
            int index = fileReversed.IndexOf(@"\"); //die Zeichenlänge des DateiNAMENs auslesen
            string fileOnlyName = file.Substring(file.Length - index, index); //nur den Dateinamen auslesen


            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(job.GetDestinationFolder() + "\\" + fileOnlyName);
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential(Manager._user, Manager._password);


            var response = (FtpWebResponse)request.GetResponse(); //WebResponse response = request.GetResponse(); 

            using (Stream source = File.OpenRead(file))
            {
                using (var destination = new StreamWithTransferSpeed(request.GetRequestStream(), streamWithTransferSpeedWorker, source.Length))//request.ContentLength))
                {
                    source.CopyTo(destination);
                }
            }

            Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);
            response.Close();
        }
    }

取消BackgroundWorker:

private void btnCancelLoad_Click(object sender, EventArgs e)
    {
        if (bGroundWorker.IsBusy)
        {
            bGroundWorker.CancelAsync();
        }
        if (streamWithTransferSpeedWorker.IsBusy)
        {
            streamWithTransferSpeedWorker.CancelAsync();
        }
    }


如您所见,我已经尝试过一些东西,但这没有任何意义。
Button-Click-Event之后,用于开始上载的Backgroundworker- CancellationPending -Flag为true ,但是上载仍在运行。

我会误会什么吗?
在写这个问题的过程中,我考虑过取消CopyTo -Method,但是我什至不知道这是否可行,或者这是否是问题/解决方案。
感谢帮助。


EDIT1:
在这里,您可以看到转发的BackgroundWorker using (var destination = new StreamWithTransferSpeed(request.GetRequestStream(), streamWithTransferSpeedWorker, source.Length))


EDIT2:
正如T MCKeown所说:布尔实例
UploadForm.cs:

 private void btnCancelLoad_Click(object sender, EventArgs e) { if (bGroundWorker.IsBusy) { bGroundWorker.CancelAsync(); Manager._cancelBackgroundWorker = true; } } 

还有我的部分:
StreamWithTransferSpeed.cs:

 if (Manager._cancelBackgroundWorker) { this.worker.CancelAsync(); //this is useless, because the Backgroundworker is still running Manager._cancelBackgroundWorker = false; innerStream.Close(); //this is dirty, but it works, after the Closing the backgroundworker is canceled } 

在这里您可以看到CancelAsync() 它在Console.WriteLine("bGW direkt unter der exception abgebrochen");
UploadForm.cs:

 void bGroundWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; Job job = (Job)e.Argument; string[] files = Directory.GetFiles(job.GetSourceFolder(), "*.*", SearchOption.AllDirectories); foreach (string file in files) { if (bGroundWorker.CancellationPending) //Falls der bGWorker abgebrochen wurde, beendet man diesen wohl einfach mit e.Cancel; { e.Cancel = true; //Sinnlos da es eh nicht funktioniert Console.WriteLine("bGW direkt unter foreach abgebrochen"); return; } char[] temp = file.ToCharArray(); //Dateipfad in CharArray speichern Array.Reverse(temp); //Reihenfolge ändern (von hinten nach vorne) string fileReversed = new string(temp); //als string speichern int index = fileReversed.IndexOf(@"\\"); //die Zeichenlänge des DateiNAMENs auslesen string fileOnlyName = file.Substring(file.Length - index, index); //nur den Dateinamen auslesen FtpWebRequest request = (FtpWebRequest)WebRequest.Create(job.GetDestinationFolder() + "\\\\" + fileOnlyName); request.Method = WebRequestMethods.Ftp.UploadFile; request.Credentials = new NetworkCredential(Manager._user, Manager._password); var response = (FtpWebResponse)request.GetResponse(); //WebResponse response = request.GetResponse(); try { using (Stream source = File.OpenRead(file)) { using (var destination = new StreamWithTransferSpeed(request.GetRequestStream(), worker, source.Length))//request.ContentLength)) { source.CopyTo(destination); } } } catch (Exception ex) { if (ex.GetType() == typeof(ObjectDisposedException)) { Console.WriteLine("Upload canceled."); if (bGroundWorker.CancellationPending) //Falls der bGWorker abgebrochen wurde, beendet man diesen wohl einfach mit e.Cancel; { e.Cancel = true; //Sinnlos da es eh nicht funktioniert Console.WriteLine("bGW direkt unter der exception abgebrochen"); return; } } } Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription); response.Close(); } } 

创建类型为bool的实例_cancel变量

private void btnCancelLoad_Click(object sender, EventArgs e)
{
  _cancel = true;
  ...
}

然后在这里检查:

foreach (string file in files)
    {
       if (_cancel ) return;

        char[] temp = file.ToCharArray(); //Dateipfad in CharArray speichern
        ...

将if语句添加到其他可能要检查取消的位置。

对EDIT2的响应:

您将代码更改为此:

foreach (string file in files)
    {
        if (bGroundWorker.CancellationPending) //Falls der bGWorker abgebrochen wurde, beendet man diesen wohl einfach mit e.Cancel;
        {
            e.Cancel = true; //Sinnlos da es eh nicht funktioniert
            Console.WriteLine("bGW direkt unter foreach abgebrochen");
            return;
        }

我建议您做这样的事情:

foreach (string file in files)
    {
        if (Manager._cancelBackgroundWorker) //Falls der bGWorker abgebrochen wurde, beendet man diesen wohl einfach mit e.Cancel;
        {
            e.Cancel = true; //Sinnlos da es eh nicht funktioniert
            Console.WriteLine("bGW direkt unter foreach abgebrochen");
            return;
        }

您将布尔值设置为true时,单击“取消”是吗?

Cancel检查代码放入Foreach循环中

if (bGroundWorker.CancellationPending) //Falls der bGWorker abgebrochen wurde, beendet man diesen wohl einfach mit e.Cancel;
{
    e.Cancel = true;
    return;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM