Джозеф Албахари имеет хороший набор статей по многопоточности, и я также нашел статей Джона Скита очень хорошими.
В .net есть много способов использовать многопоточность, но будьте осторожны, также очень легко ошибиться:)
Лично я предпочитаю использовать реактивные расширения , которые позволяют преобразовать типичный асинхронный шаблон в наблюдаемый, а также обрабатывают для вас поток пользовательского интерфейса.
, например
var wr = WebRequest.Create("http://someurl");
var o = Observable
.FromAsyncPattern<WebResponse>(wr.BeginGetResponse, wr.EndGetResponse)()
.ObserveOnDispatcher()
.Subscribe(response =>
{
// do stuff with the response
},
ex =>
{
//there has been an exception
});
Для приложений WPF / Silverlight ObserveOnDispatcher маршаллизирует наблюдателя обратно в поток пользовательского интерфейса, для фигур победы есть специальный планировщик, если это ваше предпочтительное оружие.
Если вы хотите отменить запрос до его возвращения, просто избавьтесь от IDisposable, который возвращается после вызова по подписке.
Rx требуется некоторое время, чтобы привести себя в порядок, но он очень силен, как только вы это сделаете. (Я еще не все понимаю)
Редактировать - вот код, который я набросал в приложении winforms, которое читает ответ от google.com, используя Rx:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var req = WebRequest.Create("http://www.google.com");
Observable
.FromAsyncPattern<WebResponse>(req.BeginGetResponse, req.EndGetResponse)()
.ObserveOn(this)
.Subscribe(r =>
{
using (var s = r.GetResponseStream())
using (var reader = new StreamReader(s))
{
textBox1.Text = reader.ReadToEnd();
}
},
ex =>
{
textBox1.Text = ex.Message;
});
}
}
Форма имеет текстовое поле и обновит текст ответом или сообщением об исключении ...
Вызов ObserveOn обрабатывает все содержимое Control.Invoke для вас и проверяет, что код, выполняемый по подписке, находится в правильном потоке пользовательского интерфейса.
Просто используйте nuget для установки пакета 'Rx-WinForms' для всех нужных ссылок:)