2014-04-15 94 views
0

我正在尝试调用/推送一个半大的tiff和一个Gal文件到java web服务。 该平台是Visual Studio 2013,C#windows窗体应用程序。如何从C#winform异步调用Soap/mtom Web服务

我指向WSDL文件,“平台”正在为我生成一个服务引用类。 这些都是从我这里抽象出来的,这是一件好事,因为我是这个竞技场的新手。 我离开了“生成基于任务的代码”,我得到了一个addSample和addSampleAsync方法。

我填充类字段并将代码向上推。

addSample代码工作正常,但阻止用户界面。

异步代码addSampleAsync也起作用,位比较慢并且不完全异步。 addSampleAsync将UI锁定大约一半的处理时间,并且对fncTestUpload的函数调用在相同的时间段内不会返回。

//Dimensioned at class level 
    //private static addSamplePortClient Service = new addSamplePortClient(); 
    //private static addSampleResponse Myresult = new addSampleResponse(); 

    //ThisRequest is the WSDL modeled class object. 

    //This code works, but is slow, 30 seconds on wifi 
    ResponseType Myresult = Service.addSample(ThisRequest.Request); 
    MessageBox.Show(Myresult.Message + Myresult.Code); 


    //This code locks up the UI for about 15 - 20 seconds then takes another 15 to display the messagebox 
    fncTestUpload(ThisRequest);  

    async void fncTestUpload(addSampleRequest SentRequest) 
     { 
      Myresult = await Service.addSampleAsync(SentRequest.Request); 
      MessageBox.Show(Myresult.Response.Message + " - " + Myresult.Response.Code); 
     } 

我做出了回应,在调用fncTestUpload,它调用一个异步函数时,原以为会立即返回功能做它的东西,希望对象的类级变量。直到15秒后它才会返回。

我已经花了几个小时搜索这个,并没有找到任何答案,为什么addSampleAsync工作不像广告。

微软的教程也可以用Dilbert的Elbonian编写。我无法跟随他们,也没有发现他们有帮助,所以请不要指引我。

+0

与论坛网站不同,我们不使用“谢谢”或“任何帮助表示赞赏”,或在[so]上签名。请参阅“[应该'嗨','谢谢',标语和致敬从帖子中删除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed - 从 - 个)。 –

回答

0

当你使用你的方法“等待”关键字你说“好吧,你继续做的工作,我会回手机号码,让我知道当你完成”。

所以等待的15秒是服务处理请求所需的时间,然后调用由async方法生成的状态机,在先前等待的方法结束后返回到方法。这是等待的正常行为。

关于需要15秒的MessageBox,可能是因为Response属性是lazyloading,并且实际上是在您首次访问这些属性时尝试加载代码/消息。