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