.NET 4.0 có TPL chứa lớp Task tốt đẹp để đóng gói các mô hình lập trình không đồng bộ. Tôi đang làm việc trên một ứng dụng phải có .NET 2.0, nhưng tôi muốn tránh viết lại Task. Bất kỳ đề xuất?Tôi nên làm gì để sử dụng Tác vụ <T> trong .NET 2.0?
Trả lời
Tôi biết bạn nói bạn không muốn viết lại công tác, nhưng bạn thực sự có thể tạo ra một cái gì đó khá đơn giản bằng cách sử dụng các bao đóng, hoạt động giống như một đối tượng Task. Đây là những gì tôi sử dụng:.
public delegate R AsyncTask<R>();
public static AsyncTask<R> BeginTask<R>(AsyncTask<R> function)
{
R retv = default(R);
bool completed = false;
object sync = new object();
IAsyncResult asyncResult = function.BeginInvoke(
iAsyncResult =>
{
lock (sync)
{
completed = true;
retv = function.EndInvoke(iAsyncResult);
Monitor.Pulse(sync);
}
}, null);
return delegate
{
lock (sync)
{
if (!completed)
{
Monitor.Wait(sync);
}
return retv;
}
};
}
nó một chức năng mà các cuộc gọi BeginInvoke() trên các đại biểu bạn vượt qua trong, và trả về một chức năng mà khi gọi là khối và chờ đợi kết quả của hàm thông qua vào bạn muốn phải tạo ra quá tải của hàm này cho các chữ ký phương thức khác nhau, tất nhiên.
Một cách để đi, bạn có thể tinh chỉnh điều này theo nhu cầu của mình và thêm các hành vi khác cũng như Tiếp tục, v.v. Điều quan trọng là sử dụng đóng cửa và đại biểu ẩn danh. Nên làm việc trong .NET 2.0.
EDIT - Đây là cách bạn sẽ sử dụng nó:
public static string HelloWorld()
{
return "Hello World!";
}
static void Main(string[] args)
{
var task = BeginTask(HelloWorld); // non-blocking call
string result = task(); // block and wait
}
Bạn sẽ phải sử dụng System.Threading.Thread
lớp, bạn có thể nhận được các lớp Task
cho .net 3.5 nhưng không phải cho .net 2.
Xin lỗi
Tôi đã theo ấn tượng rằng lớp công tác đi kèm với .NET 4. Làm thế nào tôi có thể sử dụng nó dưới 3,5? –
Nhóm [Rx] (http://go.microsoft.com/fwlink/?LinkID=179929) đã quay lại 'Tác vụ' và các trừu tượng mức thấp khác (nhưng không phải toàn bộ TPL) thành .NET 3.5 SP1. –
@Christial Schwarz, ^^ như Stephen đã nói, nó đã được backported. – Jethro
Cảm ơn Sean. Đây là một điểm khởi đầu tốt. –
Đối với bất kỳ ai đi qua mã, lưu ý BeginInvoke như được sử dụng ở trên bắt đầu HelloWorld trên [một chủ đề mới từ nhóm chủ đề được quản lý] (http://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool). – rkagerer