Winforms: лучший способ сохранить приложение winforms разблокированным? - PullRequest
2 голосов
/ 02 ноября 2009

У меня есть приложение winforms, которое блокируется во время запроса веб-службы

Я пытался использовать doEvents, чтобы держать приложение разблокированным, но оно все еще недостаточно отзывчиво,

Как обойти эту блокировку, чтобы приложение всегда реагировало?

Ответы [ 2 ]

5 голосов
/ 02 ноября 2009

Лучший способ - просто выполнить работу ввода-вывода в другом потоке, возможно, через BackgroundWorker или асинхронные методы WebClient.

См. Возможно здесь . Обязательно используйте Invoke при обращении к элементам управления пользовательского интерфейса (сходство потоков); полный пример:

using System;
using System.Net;
using System.Windows.Forms;
class MyForm : Form
{
    Button btn;
    TextBox txt;
    WebClient client;
    public MyForm()
    {
        btn = new Button();
        btn.Text = "Download";
        txt = new TextBox();
        txt.Multiline = true;
        txt.Dock = DockStyle.Right;
        Controls.Add(btn);
        Controls.Add(txt);
        btn.Click += new EventHandler(btn_Click);
        client = new WebClient();
        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
    }

    void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        Invoke((MethodInvoker)delegate
        {
            if (e.Cancelled) txt.Text = "Cancelled";
            else if (e.Error != null) txt.Text = e.Error.Message;
            else txt.Text = e.Result;
        });
    }

    void btn_Click(object sender, EventArgs e)
    {
        client.DownloadStringAsync(new Uri("http://google.com"));
    }
}
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new MyForm());
    }
}
3 голосов
/ 02 ноября 2009

Выполните запрос веб-службы в фоновом потоке. Остерегайтесь слишком большого количества обращений к Application.DoEvents ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...