Tôi muốn sử dụng TaskCompletionSource
quấn MyService
mà là một dịch vụ đơn giản:TaskCompletionSource ném "Một cố gắng đã được thực hiện để chuyển một nhiệm vụ đến một trạng thái cuối cùng khi nó đã hoàn thành"
public static Task<string> ProcessAsync(MyService service, int parameter)
{
var tcs = new TaskCompletionSource<string>();
//Every time ProccessAsync is called this assigns to Completed!
service.Completed += (sender, e)=>{ tcs.SetResult(e.Result); };
service.RunAsync(parameter);
return tcs.Task;
}
Mã này được hoạt động hiệu quả lần đầu tiên. Nhưng giây thứ hai thời gian tôi gọi ProcessAsync
chỉ đơn giản là xử lý sự kiện cho các Completed
được gán lại (cùng một biến service
được sử dụng mọi lúc) và do đó nó sẽ thực hiện hai lần! và lần thứ hai nó ném ngoại lệ này:
nỗ lực nhiệm vụ chuyển trạng thái cuối cùng khi đã hoàn thành
Tôi không chắc chắn, tôi nên khai báo tcs
như là một biến mức lớp như thế này:
TaskCompletionSource<string> tcs;
public static Task<string> ProccessAsync(MyService service, int parameter)
{
tcs = new TaskCompletionSource<string>();
service.Completed -= completedHandler;
service.Completed += completedHandler;
return tcs.Task;
}
private void completedHandler(object sender, CustomEventArg e)
{
tcs.SetResult(e.Result);
}
Tôi phải bọc nhiều phương thức với các kiểu trả về khác nhau và cách này tôi phải viết mã, biến, trình xử lý sự kiện để không chắc đây có phải là cách hay nhất trong kịch bản này không. Vậy có cách nào tốt hơn để thực hiện công việc này không?
@HosseinNarimaniRad Không nhất thiết. Bạn vẫn có thể sử dụng TCS cục bộ với biểu thức lambda, mặc dù nó không đơn giản như vậy. Nhìn vào mã trong câu trả lời của tôi. – i3arnon
ý tưởng hay. Tôi sẽ thử. –
Nó nói không thể chuyển đổi hoàn toàn Hành động <...,...> thành EventHandler <...> tại 'service.Completed- = callback;' do đó tôi sửa lỗi bằng cách thay đổi loại. –