无响应窗口

发布于 2024-08-09 02:54:10 字数 209 浏览 9 评论 0原文

我的代码调用 Web 服务 方法,该方法需要几分钟才能执行该操作。 在此期间,我的窗口变得无响应,并显示完全的白屏。

我不想从不同的线程调用方法。

这是最好的处理方式吗?

环境:C#、Web服务

My code calls a Web service method which takes a few minutes to perform the operation.
During that time my window becomes non responsive and it shows a complete white screen.

I don't want to the call method from a different thread.

It it the best way to handle it?

Environment: C#, web service

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

八巷 2024-08-16 02:54:11

BackgroundWorker 是您的朋友。

这是一个 示例,说明我如何将 BackgroundWorker 与 WebService 结合使用。基本上,如果不使用单独的线程,就无法在 UI 端执行密集型操作。 BackgroundWorker 是在单独线程上运行的最佳方式。

The BackgroundWorker is your friend.

Here's an example of how I use a BackgroundWorker with a WebService. Basically, there's no way to do intensive operations on the UI side without using a separate thread. The BackgroundWorker is the nicest way of running on a separate thread.

小兔几 2024-08-16 02:54:11

要拥有响应式 UI,您必须使用另一个线程。

但如果您使用 Visual Studio,生成的客户端类具有异步方法签名,可以为您完成此操作。如果你的方法是
“GetData”,那么您应该有一个名为“GetDataAsync”的方法,它不会冻结您的窗口。

这是一个例子:

WsClient client;
protected override void Load() {
    base.Onload();
    client = new WsClient();
    client.GetDataCompleted += new GetDataCompletedEventHandler(client_GetDataCompleted);
}

//here is the call
protected void Invoke()
{
    client.GetDataAsync(txtSearch.Text);
}

//here is the result
void client_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
    //display the result
    txtResult.Text = e.Result;
}

To have a responsive UI, you must use another thread.

But if you use visual studio, the generated client class have asynchronous method signatures wich would do it for you. If your method is
"GetData", then you should have a method called "GetDataAsync" wich would not freeze your window.

Here is an example :

WsClient client;
protected override void Load() {
    base.Onload();
    client = new WsClient();
    client.GetDataCompleted += new GetDataCompletedEventHandler(client_GetDataCompleted);
}

//here is the call
protected void Invoke()
{
    client.GetDataAsync(txtSearch.Text);
}

//here is the result
void client_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
    //display the result
    txtResult.Text = e.Result;
}
再可℃爱ぅ一点好了 2024-08-16 02:54:11

您可以在单独的线程上发出请求,这将使 UI 线程保持响应。完成后,您需要将响应同步回 UI 线程。

You can make the request on a separate thread, which will leave the UI thread responsive. You'll need to synchronise the response back to the UI thread once you've finished.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文