2010-05-06 172 views
0

我有一個程序,上傳/下載文件到一個在線服務器,有一個回調報告進度並將其記錄到文本文件中,該程序是用結構如下:C#:我的回調函數被調用兩次,每發送一個請求

public void Upload(string source, string destination) 
{  
     //Object containing Source and destination to pass to the threaded function 
     KeyValuePair<string, string> file = new KeyValuePair<string, string>(source, destination); 
     //Threading to make sure no blocking happens after calling upload Function 
     Thread t = new Thread(new ParameterizedThreadStart(amazonHandler.TUpload)); 
     t.Start(file); 
} 

    private void TUpload(object fileInfo) 
{ 
    KeyValuePair<string, string> file = (KeyValuePair<string, string>)fileInfo; 
    /* 
    Some Magic goes here,Checking The file and Authorizing Upload 
    */ 
    var ftiObject = new FtiObject() 
     { FileNameOnHDD = file.Key, 
      DestinationPath = file.Value, 
      //Has more data used for calculations. 
     }; 
      //Threading to make sure progress gets callback gets called. 
     Thread t = new Thread(new ParameterizedThreadStart(amazonHandler.UploadOP)); 
      t.Start(ftiObject); 
      //Signal used to stop progress untill uploadCompleted is called. 
      uploadChunkDoneSignal.WaitOne(); 
     /* 
      Some Extra Code 
     */ 
} 

private void UploadOP(object ftiSentObject) 
{ 
    FtiObject ftiObject = (FtiObject)ftiSentObject; 
    /* 
    Some useless code to create the uri and prepare the ftiObject. 
    */ 

    // webClient.UploadFileAsync will open a thread that 
    // will upload the file and report 
    // progress/complete using registered callback functions. 

    webClient.UploadFileAsync(uri, "PUT", ftiObject.FileNameOnHDD, ftiObject); 
} 

我得到了註冊到Web客戶端的UploadProgressChanged事件的回調,但它獲取調用每次發送的請求兩次。

void UploadProgressCallback(object sender, UploadProgressChangedEventArgs e) 
    { 
     FtiObject ftiObject = (FtiObject)e.UserState; 
       Logger.log(ftiObject.FileNameOnHDD, (double)e.BytesSent ,e.TotalBytesToSend); 
    } 

日誌輸出:

Filename: C:\Text1.txt Uploaded:1024 TotalFileSize: 665241 
    Filename: C:\Text1.txt Uploaded:1024 TotalFileSize: 665241 
    Filename: C:\Text1.txt Uploaded:2048 TotalFileSize: 665241 
    Filename: C:\Text1.txt Uploaded:2048 TotalFileSize: 665241 
    Filename: C:\Text1.txt Uploaded:3072 TotalFileSize: 665241 
    Filename: C:\Text1.txt Uploaded:3072 TotalFileSize: 665241 
    Etc... 

我使用的是觀察者看網絡流量,並且只有1請求被髮送。

一些我怎麼弄清楚爲什麼回調被調用兩次,我的疑問是,回調是由每個線程打開(主要上載和TUpload)被解僱,但我不知道如何測試,如果這就是原因。

注意:許多/ ** /註釋背後的原因是表明函數不僅僅是打開線程,而且正在使用線程來確保不會發生阻塞(有一些「Signal.WaitOne( )「圍繞代碼進行同步)

回答

1

如果您在回調中放置了一個斷點,難道您不能檢查callstack以查看來電的來源嗎?如果你使用的是Visual Studio。

+0

嘗試了Callstack它沒有幫助..回調被mscorlib.dll調用..如果我嘗試斷點它..它停止第二點..然而+1幫助我閱讀和學習一個新的訣竅: ) – 2010-05-06 09:41:06

1

您是否檢查過API是否確實使用UploadProgressChangedEventArgs中的不同信息回調twise?

+0

看來,webclient本身正在做雙重調用,不知何故,它滑倒我的頭腦檢查「UploadProgressChangedEventArgs」的所有屬性,我只檢查發送和他們是相同的,但是當我檢查接收到的參數,他們改變從-1到0 ..顯然是2個不同的調用,與我的線程無關。 – 2010-05-06 09:42:33