.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
- 1. Tôi nên sử dụng những gì để tuần tự hóa một DataTable thành JSON trong ASP.NET 2.0?
- 2. AFNetworking 2.0 hủy tác vụ cụ thể
- 3. Tôi có thể sử dụng thư viện .NET 4.0 trong ứng dụng .NET 2.0 không?
- 4. Tôi nên truyền bá ngoại lệ nhiệm vụ từ tác vụ tiếp tục trong .NET 4.0 như thế nào?
- 5. Tôi có nên sử dụng Chủ đề hoặc Tác vụ - Mô phỏng Nhiều khách hàng
- 6. Tôi có nên sử dụng một khung công tác không?
- 7. Tôi nên sử dụng cái gì cho lớp BigInt trong .NET?
- 8. Tôi làm cách nào để lên lịch tác vụ trong ứng dụng WinForms?
- 9. Tại sao không nên sử dụng attach() trong R, và tôi nên sử dụng cái gì?
- 10. Tôi nên sử dụng thư viện biểu đồ .net nào?
- 11. Tôi nên sử dụng gì thay vì windows.h trong linux
- 12. Sử dụng các phương pháp mở rộng trong .NET 2.0?
- 13. người bạn trong toán tử == hoặc << khi nào tôi nên sử dụng?
- 14. Tôi nên sử dụng gì thay vì printf trong Perl?
- 15. Các toán tử này làm gì trong D 2.0: <> =! <> =! <= !> =
- 16. sharedDispatcher bị thiếu trong CCTouchDispatcher (Cocos2D 2.0 beta2), tôi nên sử dụng cái nào?
- 17. Sử dụng Play 2.0 để tạo một dịch vụ web
- 18. Hợp tác đa tác vụ bằng cách sử dụng TPL
- 19. Phương thức nên trong API trả về Tác vụ kết thúc bằng Tác vụ hoặc Async
- 20. Thiết lập tác vụ theo lịch .Net
- 21. SAML với .NET 2.0
- 22. Làm thế nào để hỗ trợ .NET 2.0 và .NET 4.0 trong một ứng dụng?
- 23. Sử dụng ADFS 2.0 với các dịch vụ không phải.NET
- 24. Giết một Tác vụ bị khóa trong .NET 4 TPL
- 25. Công nghệ tốt nhất để sử dụng để tự động hóa tác vụ bằng cách sử dụng thư viện .net là gì?
- 26. Tôi có nên sử dụng HTML <button> hoặc <input> không?
- 27. Tôi có nên nhận thấy sự khác biệt trong việc sử dụng Task vs Threads trong .Net 4.0 không?
- 28. Tôi có nên học/sử dụng MapReduce hoặc một số loại song song khác cho tác vụ này không?
- 29. Khi nào nên sử dụng <%# ... %> và <%= ... %>?
- 30. Tại sao tôi nên sử dụng <ARGV> hoặc <> thay vì <STDIN> trong Perl?
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