как отменить DoWork в Backgroundworker

я знаю, что это не первый вопрос об отмене BackGroundWorker, но я не нашел ответа, чтобы решить мою проблему.
у меня есть метод, который отправляет файл.. я использую backgroundworker для его вызова..
Итак, как я могу отменить backgroundworker в середине отправки файла .. я имею в виду, куда я должен положить

if (backgroundWorker1.CancellationPending == true)
   {
       e.Cancel = true;
       break;
   }

вот код:

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        List<object> job = (List<object>)e.Argument;
        string srcPath = (string)job[0];
        string destPath = (string)job[1];
        SendFile(srcPath, destPath);
    }

Способ отправки:

 private void SendFile(string srcPath, string destPath)
    {
        string dest = Path.Combine(destPath, Path.GetFileName(srcPath));
        using (fs = new FileStream(srcPath, FileMode.Open, FileAccess.Read))
        {
            try
            {
                long fileSize = fs.Length;
                if (sizeAll == 0)
                    sizeAll = fileSize;
                sum = 0;
                int count = 0;
                data = new byte[packetSize];
                SendCommand("receive<" + dest + "<" + fs.Length.ToString());
                ProgressLabel(++fileCount, allFileCount);
                InfoLabel("Sending " + srcPath, "busy");
                while (sum < fileSize)
                {
                    count = fs.Read(data, 0, data.Length);
                    network.Write(data, 0, count);
                    sum += count;
                    sumAll += count;
                    backgroundWorker1.ReportProgress((int)((sum * 100) / fileSize));
                }
                network.Flush();
            }
            finally
            {
                network.Read(new byte[1], 0, 1);
                CloseTransfer();
            }
        }
    }

я должен проверить CancellationPending в цикле while() в методе отправки ... но я не могу получить доступ к [e.Cancel] backgroundworker из этого метода ... что мне делать?


person Murhaf Sousli    schedule 09.03.2012    source источник
comment
В чем проблема передать e в качестве параметра из backgroundWorker1_DoWork в SendFile, а затем проверить цикл while после ReportProgress? У вас также есть предложение finally для CloseTransfer   -  person Steve    schedule 10.03.2012
comment
@Steve .. вы имеете в виду, например, изменить метод sendfile на: void SendFile (string srcPath, string destPath, DoWorkEventArgs e)   -  person Murhaf Sousli    schedule 10.03.2012
comment
Да это все Просто добавьте в SendFile третий аргумент   -  person Steve    schedule 10.03.2012


Ответы (2)


DoWorkEventArgs может быть передан в качестве третьего аргумента в SendFile:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    List<object> job = (List<object>)e.Argument; 
    string srcPath = (string)job[0]; 
    string destPath = (string)job[1]; 
    SendFile(srcPath, destPath, e); 
} 

тогда SendFile будет

private void SendFile(string srcPath, string destPath, DoWorkEventArgs e)   

и в вашем цикле после ReportProgress

   if (backgroundWorker1.CancellationPending == true)    
   {    
       e.Cancel = true;    
       return; // this will fall to the finally and close everything    
   }   
person Steve    schedule 09.03.2012

Поместите это в свой цикл while:

while (sum < fileSize)
{
    if (worker.CancellationPending)
    {
        e.Cancel = true;
        break;
    }

    count = fs.Read(data, 0, data.Length);
    network.Write(data, 0, count);
    sum += count;
    sumAll += count;
    backgroundWorker1.ReportProgress((int)((sum * 100) / fileSize));
}
network.Flush();
person Robert Harvey    schedule 09.03.2012
comment
NOOO важная часть e.Cancel = true; - person Murhaf Sousli; 10.03.2012
comment
нет e.Cancel !! я должен передать e от backgroundworker_dowork? - person Murhaf Sousli; 10.03.2012