Я бы рекомендовал делать асинхронные операции ввода-вывода. Это немного проще настроить и не требует, чтобы вы сами создавали новые потоки.
Асинхронное программирование - это то, где у вас есть, например, поток файлов, который вы хотите записать, но не хотите дождаться его завершения. Возможно, вам захочется узнать, когда он будет готов, но вы не хотите ждать.
Что вы делаете, используя функции в BeginWrite/BeginRead и EndWrite/EndRead, которые доступны в классе Stream.
В вашем методе вы начинаете с вызова BeginWrite со всеми данными, которые вы хотите записать, а также передаете функцию обратного вызова. Эта функция будет вызываться, когда BeginWrite закончен.
Внутри функции обратного вызова вы вызываете EndWrite и очищаете поток и проверяете наличие ошибок.
BeginWrite не будет блокировать, что означает, что если он вызван из обработчика событий, этот поток может завершить этот обработчик и продолжить обработку большего количества событий (например, других событий GUI).
using System;
using System.IO;
using System.Text;
class Program
{
private static FileStream stream;
static void Main(string[] args)
{
stream = new FileStream("foo.txt",
FileMode.Create,
FileAccess.Write);
const string mystring = "Foobarlalala";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(mystring);
Console.WriteLine("Started writing");
stream.BeginWrite(data, 0, data.Length, callback, null);
Console.WriteLine("Writing dispatched, sleeping 5 secs");
System.Threading.Thread.Sleep(5000);
}
public static void callback(IAsyncResult ia)
{
stream.EndWrite(ia);
Console.WriteLine("Finished writing");
}
}
}
Сон очень важен, потому что нить, которая пишет материал, будет убита, если основная нить будет уничтожена. Это не проблема в графическом приложении, только здесь, в этом небольшом примере.
MSDN имеет pretty good overview о том, как писать этот материал, а также некоторые good articles по программированию асинхронного в целом в случае, если вы идете на backgroundworker или ThreadPool.
Я бы подумал, что было бы лучше сделать копию данных и передать их второму рабочему, а не отключать части пользовательского интерфейса. – Quibblesome
@Quarrelsome: Иногда. Это действительно зависит от ситуации, и ожидает ли пользователь, что результатом будет моментальный снимок или нет. Также в некоторых случаях сделать полный снимок может быть очень сложно, так как лучше иметь надежную, но слегка раздражающую программу, чем сломанную :) –