2010-05-06 171 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