2012-01-12 39 views
6

Tôi có một dịch vụ web có thể được chia thành hai phần chính:Web Service ASP.Net: Mã Chạy không đồng bộ

[WebMethod] 
MyServiceCall() 
{ 
    //Do stuff the client cares about 

    //Do stuff I care about 
} 

Những gì tôi muốn làm là chạy phần thứ 2 trên thread khác, để khách hàng không chờ đợi nó: khi logic của người dùng đã hoàn thành, hãy gửi thông tin của họ ngay lập tức, nhưng tiếp tục xử lý nội dung tôi quan tâm (ghi nhật ký, v.v.).

Từ một dịch vụ web, cách được khuyến nghị để chạy phần 2 thứ hai không đồng bộ, để đưa người dùng trở lại thông tin của họ nhanh nhất có thể? BackgroundWorker? QueueUserWorkItem?

+2

Bạn đọc: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background -tasks-in-asp-net.aspx –

Trả lời

4

Bạn có thể muốn xem xét Tasks tính năng mới đối với .NET 4.0.

Nó cho phép bạn khởi động một hoạt động không đồng bộ, nhưng cũng cung cấp cho bạn một cách dễ dàng để xem nó được thực hiện hay không sau này.

var task = Task.Factory.StartNew(() => DoSomeWork()); 

Nó sẽ khởi động DoSomeWork() và tiếp tục mà không cần chờ để bạn có thể tiếp tục xử lý khác. Khi bạn nhận được đến điểm mà bạn không muốn để xử lý nữa cho đến khi nhiệm vụ không đồng bộ của bạn đã hoàn tất, bạn có thể gọi:

task.Wait(); 

Mà sẽ chờ đó cho đến khi nhiệm vụ đã hoàn thành. Nếu bạn muốn nhận lại kết quả từ nhiệm vụ, bạn có thể thực hiện việc này:

var task = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(3000); 
    return "dummy value"; 
}); 
Console.WriteLine(task.Result); 

Cuộc gọi đến công việc.Khởi động lại cho đến khi có kết quả.

Dưới đây là một hướng dẫn bao gồm Nhiệm vụ chi tiết hơn: http://www.codethinked.com/net-40-and-systemthreadingtasks

+0

Chấp nhận điều này làm câu trả lời; Tuy nhiên, tôi nghĩ rằng tôi sẽ tạm dừng thực sự thực hiện điều này tại thời điểm này sau khi đọc bài đăng trên blog trong bình luận của Darin Dimitrov. Có vẻ như có thể có vấn đề với việc thực hiện điều này nếu miền đang chạy bị dừng/tái chế – John

1

Cách dễ nhất để bắn ra một chủ đề mới có lẽ là:

new Thread(() => 
{ 
    /// do whatever you want here 
}).Start(); 

Hãy cẩn thận, mặc dù - nếu dịch vụ này được nhấn rất thường xuyên, bạn có thể gió lên tạo ra rất nhiều chủ đề mà chặn lẫn nhau.

Các vấn đề liên quan