Tôi đang tìm một cách đơn giản để thực hiện tác vụ ở chế độ nền, sau đó cập nhật nội dung nào đó (trên chuỗi chính) khi hoàn thành. Nó thuộc tầng lớp 'mô hình' mức thấp nên tôi không thể gọi InvokeOnMainThread vì tôi không có NSObject xung quanh. Tôi có phương pháp này:C# chủ đề nền đơn giản
public void GetItemsAsync(Action<Item[]> handleResult)
{
Item[] items=null;
Task task=Task.Factory.StartNew(() =>
{
items=this.CreateItems(); // May take a second or two
});
task.ContinueWith(delegate
{
handleResult(items);
}, TaskScheduler.FromCurrentSynchronizationContext());
}
Điều này dường như làm việc OK, nhưng
1) Đây có phải là tốt nhất (đơn giản nhất) cách?
2) Tôi đang lo lắng về biến cục bộ:
Item{} items=null
ngừng mà biến mất khi trở về phương pháp trước khi thread nền hoàn gì?
Cảm ơn.
Cảm ơn, đó là nguyên tắc tốt hơn. Thậm chí có thể xóa biến tác vụ yourClass.CreateItems (mã thông báo) .ContinueWith (t => { }, TaskScheduler.FromCurrentSynchronizationContext()); Thật đáng tiếc, chúng ta cần "TaskScheduler.FromCurrentSynchronizationContext()". Tôi muốn API đơn giản nhất có thể cho khách hàng nên nó hoặc là: 1) yourClass.GetItemsAsync (đại biểu (Item [] mục) {\t // Do something với mục }); hoặc 2) yourClass.CreateItems (.) ContinueWith (t => { // Do something với t.Result }, TaskScheduler.FromCurrentSynchronizationContext()); Vì vậy, tôi vẫn cần phương thức GetItemsAsync thực sự. – Bbx
Vâng, bạn nói đúng. Nhưng GetItemsAsync rõ ràng hơn nhiều so với giải pháp trước đây về các nguyên tắc OO và lập trình dựa trên tác vụ. Ví dụ, bằng cách sử dụng kỹ thuật được đề xuất, nó sẽ dễ di chuyển hơn nhiều để chờ đợi/các tính năng không đồng bộ C# 5.0. Trong điều khoản của OOP giải pháp này là đơn giản hơn bởi vì nó không cố gắng để phát minh ra bánh xe. Và đừng quên một testability: trong trường hợp này bạn có thể dễ dàng có được nhiệm vụ này từ thực hiện giả và kiểm tra bất kỳ trường hợp góc của bạn mã khách hàng. –