2009-11-02 2 views
2

У меня есть приложение WinForms, который запирание во время запроса веб-службыWinforms: Лучший способ сохранить winforms приложение разблокировано?

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

Как я могу получить вокруг этого замка , так что приложение всегда реагирует?

ответ

3

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

+0

операции кросс-нить не действует: Control «listView_mylist» доступ из потока, отличного от резьбы она была создана на –

+0

this.Invoke (новый MethodInvoker (делегат { listView_mylist.Items [поз] .SubItems [5] .Text = «успех (не настроен cert)»; })); –

+0

Добавление комментариев для следующего парня - кому нужно решение –

5

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

См. Возможно here. Обязательно используйте 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()); 
    } 
} 
Смежные вопросы