2010-08-02 14 views
11

Khung kiểm tra Đơn vị Silverlight xác định quy trình để xử lý cuộc gọi Async (lấy lớp thử nghiệm từ Microsoft.Silverlight.Testing.SilverlightTest, thêm thuộc tính Không đồng bộ, sử dụng phương thức EnqueueXXX.) Xem xét việc phân tách mà SpecFlow trình bày giữa lớp kiểm tra và các bước:Xử lý Async Với luồng cho Silverlight

  • Những công cụ này có thể được thực hiện một cách không đồng bộ (chẳng hạn như thực hiện cuộc gọi dịch vụ web) không?
  • Nếu không thể, hướng dẫn xử lý hành vi này trong tệp kiểm tra SpecFlow là gì? (Có lẽ sử dụng một AutoResetEvent đó được vấp trong một event handler và chờ đợi vào nó?)

Trả lời

1

Tôi đoán mọi người đã nhìn và upvoted câu hỏi này đã được chờ đợi một người nào đó có một, câu trả lời thanh lịch tuyệt vời, nhưng nó không nhìn điều đó sẽ xảy ra ở đây. Để giúp đỡ người khác, những người cần một câu trả lời có thể sử dụng ngay bây giờ ...

Những gì tôi đã làm với các tình huống đơn vị thử nghiệm khác là sử dụng một AutoResetEvent như bạn đã đề cập trong câu hỏi:

AutoResetEvent MyAutoReset = new AutoResetEvent(); 
[TestMethod] 
public void MyTestMethod() 
{ 
    var MyItem.GetItem(x => 
     { 
     // Return handler 
     MyAutoReset.Set(); 
     }); 
    MyAutoReset.WaitOne(5000, false)); 
} 

Rõ ràng có một vài những điều cần xem xét với phương pháp này, nhưng nó có ý tưởng trên.

+0

Cảm ơn bạn đã cập nhật Jason. Rõ ràng, nó đã được một thời gian kể từ khi ban đầu này được đăng. Tôi sẽ rất vui khi đánh dấu nó như một câu trả lời khi tôi có thể dành chút thời gian để áp dụng mã này cho một bài kiểm tra có nguồn gốc từ SpecFlow. Ngoài ra, tôi tự hỏi nếu Async CTP mới sẽ mang lại bất cứ điều gì để chịu về vấn đề này. – avidgator

2

Sử dụng AutoResetEvent sẽ không hoạt động vì cuộc gọi WaitOne sẽ chặn chuỗi giao diện người dùng. Silverlight sử dụng chuỗi giao diện người dùng ngay cả khi thực hiện cuộc gọi không đồng bộ với một dịch vụ dữ liệu (xem bài đăng này - Thead is blocked using WebClient and ManualResetEvent) để WaitOne thực sự sẽ ngừng dịch vụ này khỏi bị gọi.