如何在不阻止客户端执行的情况下调用Web服务?

时间:2011-11-19 21:26:45

标签: c# .net wcf web-services asynchronous

我有一个Windows窗体应用程序,它通过使用SvcUtil从WSDL描述符生成的代理来调用Web服务。这些调用可以持续几分钟,在此期间我不希望客户端应用程序“冻结”。我该怎么做才能做到这一点?我想有些事情Threading相关,但我不确定如何在这种情况下管理返回值和参数。

4 个答案:

答案 0 :(得分:3)

您可以使用BackgroundWorker

private void wrk_DoWork(object sender, DoWorkEventArgs e)
{
    // Do your work here
}

private void wrk_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // Executed when worker completed its execution
}

private void StartIt()
{
    BackgroundWorker wrk1 = new BackgroundWorker();
    wrk1.DoWork += wrk_DoWork;
    wrk1.RunWorkerCompleted += wrk_RunWorkerCompleted;
    wrk1.RunWorkerAsync();
}

答案 1 :(得分:2)

我会去找一名背景工作者。

设置RunWorkerCompleted事件和DoWork,运行它,当您在DoWork中获得结果时,将事件参数设置为结果(e.Result)。

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    // Do your processing
    e.Result = result;
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
     ResultLabel.Text = (string)e.Result;
}

示例未经过测试,但您的IDE应该可以帮助您。您还必须解析BackgroundWorker,或者只需添加

using System.ComponentModel;

此处提供更多信息:http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

希望它有所帮助!

答案 2 :(得分:1)

您可以使用以Begin ......

开头的方法

例如,使用BeginAbc()代替Abc()

答案 3 :(得分:0)

我建议调查BackgroundWorkers ..

BackgroundWorker proxyWorker = new BackgroundWorker();
proxyWorker.DoWork +=
   (sender, args) =>
   {
     //make proxy call here
   };

proxyWorker.RunWorkerAsync();