Tôi có Thư viện lớp di động (PCL) được nhắm mục tiêu tại Profile158 (Windows Store, .NET 4.5, Silverlight 5, Windows Phone 8). Tôi có thể dễ dàng làm việc với các phương thức trả về một loại Tác vụ và tất cả hoạt động như tôi mong đợi. Bất cứ khi nào tôi truy cập thuộc tính Result, nó kết thúc chạy mã không đồng bộ và trả về kết quả.Sử dụng Microsoft.bcl.async trong PCL với Mono Droid?
Tuy nhiên, nếu tôi sử dụng từ khóa async/await trong phương thức bên trong PCL, tôi sẽ nhận lại tác vụ. Tuy nhiên, khi tôi cố gắng truy cập thuộc tính Result, nó chặn và không bao giờ trả về.
Nhìn vào cửa sổ xuất debug trong Visual Studio trong cả hai trường hợp tôi thấy văn bản giống nhau:
Thread started:
Thread started:
Loaded assembly: Mono.Security.dll [External]
Thread started:
Thread started:
Vì vậy, dường như nếu mã đang được chạy, nhưng nó không bao giờ quay trở lại thread UI. Có ai khác đã cố gắng sử dụng PCL với Microsoft.bcl.async trong PCL không?
Dự án Mono Droid của tôi được nhắm mục tiêu đến Android 2.1.
Cảm ơn, - John
Cập nhật:
Dưới đây là thêm một số thông tin về các kịch bản khác nhau. Thứ nhất, đây là mã mà không làm việc trên Mono Droid khi viết bằng mã UI:
var task = request.GetResponseAsync();
string html = task.Result.GetResponseText();
Sau đó tôi tạo các phương pháp sau đây trong PCL:
public async Task<string> Test()
{
IHttpResponse responce = await GetResponseAsync();
return responce.GetResponseText();
}
Và gọi nó với mã này từ mã UI mono:
string html = request.Test().Result;
nó không bao giờ trở lại ...
Nếu bạn sử dụng thuộc tính Kết quả, thuộc tính này sẽ bị chặn cho đến khi tác vụ hoàn tất. Nếu bạn đang làm điều đó từ cùng một chủ đề mà bản thân nhiệm vụ cần thực thi, về cơ bản bạn đã cho mình một bế tắc. Nó không phải là tất cả rõ ràng những gì mã của bạn hiện tại ... bạn có một chương trình ngắn nhưng đầy đủ chứng minh vấn đề? –
@dsplaisted đã sử dụng lớp này với MonoDroid trong bản trình diễn của anh ấy tại BUILD - http://channel9.msdn.com/Events/Build/2012/3-004 - Tôi sẽ thêm thẻ PCL vào bài đăng này và đưa ra tín hiệu dơi - anh ta sẽ đi cùng trong giờ Redmond ... – Stuart
Không liên quan đến câu hỏi của bạn, nhưng Microsoft.Bcl.Async vẫn là phiên bản beta. Sử dụng nó trong bất kỳ mã sản xuất nên tránh. Tất nhiên, bạn có thể chỉ đang thử nghiệm nó ngay bây giờ. –