我有一个程序,上传/下载文件到一个在线服务器,有一个回调报告进度并将其记录到文本文件中,该程序是用结构如下: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