我有一個程序,上傳/下載文件到一個在線服務器,有一個回調報告進度並將其記錄到文本文件中,該程序是用結構如下: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( )「圍繞代碼進行同步)
嘗試了Callstack它沒有幫助..回調被mscorlib.dll調用..如果我嘗試斷點它..它停止第二點..然而+1幫助我閱讀和學習一個新的訣竅: ) – 2010-05-06 09:41:06