C#:对于每个发送的请求,我的回调函数都会被调用两次
我有一个程序,可以将文件上传/下载到在线服务器,有一个回调来报告进度并将其记录到文本文件中,该程序采用以下结构构建:C#:对于每个发送的请求,我的回调函数都会被调用两次,c#,callback,C#,Callback,我有一个程序,可以将文件上传/下载到在线服务器,有一个回调来报告进度并将其记录到文本文件中,该程序采用以下结构构建: public void Upload(string source, string destination) { //Object containing Source and destination to pass to the threaded function KeyValuePair<string, string> fil
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);
}
日志输出:
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...
我正在使用监视程序监视网络流量,只发送了一个请求
我不知道为什么回调会被调用两次,我的怀疑是回调会被每个打开的线程(主上传和TUpload)触发,但是我不知道如何测试这是否是原因
注意:许多/**/注释背后的原因是表明函数不仅仅是打开线程,而且线程用于确保不会发生阻塞(同步代码周围有两个“Signal.WaitOne()”)如果在回调上设置断点,你不能检查一下调用堆栈看看调用来自哪里吗?如果您使用的是Visual Studio,那就是。您是否检查过API是否确实没有使用UploadProgressChangedEventArgs中的不同信息回调twise?尝试了调用堆栈,但没有帮助。。回调函数被mscorlib.dll调用。如果我尝试将其中断,它将停止第二个点。。然而+1帮助我阅读和学习了一个新技巧:)似乎webclient本身正在进行双重调用,不知怎的,我忘记了检查“UploadProgressChangedEventArgs”的所有属性,我只检查了发送的,它们是相同的,但是当我检查接收的参数时,它们从-1变为0。。显然是两个不同的调用,与我的线程无关。。
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...