Mọi biến thể trên mã sau mà tôi thử không hoạt động - cho dù DoSomething() : void
và được gọi là viết hoặc DoSomething() : Task
và được gọi với TaskEx.RunEx()
, một số nỗ lực liên quan đến .GetAwaiter().GetResult()
. Lỗi được thấy bao gồm: "Start may not be called on a task with null action"
, "RunSynchronously may not be called on a task unbound to a delegate"
và "The task has not yet completed"
.Gọi một phương thức không đồng bộ từ một phương pháp không đồng bộ
class Program
{
static void Main(string[] args) // Starting from a non-async method
{
DoSomething();
Console.WriteLine("Press any key to quit.");
Console.ReadKey();
}
static async void DoSomething()
{
Console.WriteLine("Starting DoSomething ...");
var x = await PrepareAwaitable(1);
Console.WriteLine("::" + x);
var y = await PrepareAwaitable(2);
Console.WriteLine("::" + y);
}
static Task<string> PrepareAwaitable(int id)
{
return new Task<string>(() =>
{
return "Howdy " + id.ToString();
});
}
}
Output:
Bắt đầu DoSomething ...
Nhấn phím bất kỳ để bỏ thuốc lá.
's sẽ phức tạp hơn sau này. Khi hành động này hoàn tất, tuy nhiên phải mất nhiều thời gian, tôi mong đợi Task
(hoặc các cơ chế Khung khác) tiếp tục bằng cách gán "Howdy ..."
cho x, và sau đó là y. Những gì tôi thực sự muốn làm là đánh chặn các đối tượng đang chờ đợi, xử lý chúng, và vào một thời gian sau đó tôi kiểm soát, tiếp tục với việc tiếp tục với kết quả (x
và y
). Nhưng tôi đã không nhận được rất nhiều trên bước lớn đó, vì vậy tôi đang cố gắng để bắt đầu nhỏ hơn.
Bạn đang cố * làm gì? Thật khó để biết những gì "không hoạt động" có nghĩa là khi chúng ta không biết những gì "làm việc" sẽ như thế nào. –
Tôi muốn nó chạy để hoàn thành, xin vui lòng. Có lẽ nó dường như rõ ràng đối với tôi những gì nó nên làm do sự hiểu biết của tôi sai. –
@uosef: Chạy cái gì? Không có gì thực sự không đồng bộ ở đây? –