2012-03-09 13 views
3

これはBackGroundWorkerのキャンセルに関する最初の質問ではありませんが、私の問題を解決するための答えが見つかりませんでした。
私は
が、どのように私は、ファイルを送信の途中でのBackgroundWorkerをキャンセルすることができます。..それを呼び出すためにBackgroundWorkerのを使用してファイル..イムを送信する方法を持っている..私は私がここにバックグラウンドワーカーでDoWorkをキャンセルする方法

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); 
    } 

送る方法:私はしばらくCancellationPendingをチェックする必要があり

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(); 
      } 
     } 
    } 

()ループ私はこのメソッドからバックグラウンド労働者の[e.Cancel]に行くことができません。どうすればいいですか?

+0

backgroundWorker1_DoWorkのパラメータとしてeをSendFileに渡し、ReportProgressの後にwhileループでチェックインするのはなぜですか?あなたはまた、CloseTransferにfinally節を持っています – Steve

+0

@スティーブ.. sendfileメソッドを編集するのは次のようなものです: void SendFile(文字列srcPath、string destPath、DoWorkEventArgs e) –

+4

はいすべてですSendFileに第3引数を追加するだけです – Steve

答えて

8

DoWorkEventArgs eはSENDFILEで3番目の引数として渡すことができます。

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  
    } 
3

あなた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(); 
+1

NOO重要な部分e.Cancel = trueです。 –

+0

OK、私の編集を参照してください。 –

+0

e.Cancelはありません!私はbackgroundworker_doworkからeを渡すべきですか? –

関連する問題