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...