Лучший способ - просто выполнить работу с 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());
}
}
операции кросс-нить не действует: Control «listView_mylist» доступ из потока, отличного от резьбы она была создана на –
this.Invoke (новый MethodInvoker (делегат { listView_mylist.Items [поз] .SubItems [5] .Text = «успех (не настроен cert)»; })); –
Добавление комментариев для следующего парня - кому нужно решение –