Tôi đang cố gắng thực hiện một số công cụ không đồng bộ trong phương thức webservice. Giả sử tôi có lệnh gọi API sau: http://www.example.com/api.asmxDịch vụ Web .NET & Chủ đề nềnWorker
và phương thức được gọi là GetProducts().
Tôi phương pháp GetProducts này, tôi làm một số công cụ (ví dụ: lấy dữ liệu từ cơ sở dữ liệu), ngay trước khi tôi trả lại kết quả, tôi muốn thực hiện một số công cụ async (ví dụ: gửi cho tôi email).
Vì vậy, đây là những gì tôi đã làm.
[WebMethod(Description = "Bal blah blah.")]
public IList<Product> GetProducts()
{
// Blah blah blah ..
// Get data from DB .. hi DB!
// var myData = .......
// Moar clbuttic blahs :) (yes, google for clbuttic if you don't know what that is)
// Ok .. now send me an email for no particular reason, but to prove that async stuff works.
var myObject = new MyObject();
myObject.SendDataAsync();
// Ok, now return the result.
return myData;
}
}
public class TrackingCode
{
public void SendDataAsync()
{
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += BackgroundWorker_DoWork;
backgroundWorker.RunWorkerAsync();
//System.Threading.Thread.Sleep(1000 * 20);
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
SendEmail();
}
}
Bây giờ, khi tôi chạy mã này, email sẽ không bao giờ được gửi. Nếu tôi uncomment ra Thread.Sleep .. sau đó email được gửi đi.
Vậy ... tại sao chuỗi công nhân nền bị rách? là nó phụ thuộc vào thread cha? Đây có phải là cách sai tôi nên làm nền hoặc chia hai luồng, trong các ứng dụng web asp.net?
Giấc ngủ được nhận xét. Tôi đặt nó ở đó để xem tôi có thể gửi email không. khi giấc ngủ được CHẤP NHẬN, thì mã chuỗi công nhân nền được thực thi. khi mã được tạo ra, thì mã chuỗi công nhân nền không bao giờ được thực thi. Tôi sẽ thử sử dụng ThreadPool thay thế. –
> * Nếu bạn có khối lượng lớn, sau đó một nhà sản xuất/hàng tiêu dùng có thể cho phép điều chỉnh tốt hơn (vì vậy bạn không bị chết đuối trong chủ đề) * ooooooo !!!Tôi vui vì bạn đã thực sự nêu lên điểm này! phương pháp dịch vụ web thực sự là khối lượng cao! Ngoài ra, để làm cho vấn đề thực sự thú vị, nó không thực sự gửi một email, nhưng thực sự nhấn một trang web bên ngoài (ekk, không hỏi) ... vì vậy bạn sẽ đề nghị tôi làm điều này nhà sản xuất/hàng tiêu dùng thingy? Nếu vậy ... đây có phải là trang tốt để tham khảo không? http://www.albahari.com/threading/part4.aspx (vui lòng cuộn xuống một chút công bằng để viết mã + ví dụ). suy nghĩ? –
@Marc Gravell Tôi đã thử sử dụng giải pháp của bạn nhưng tôi chỉ tự hỏi tại sao phải mất quá nhiều thời gian để hoàn thành nhiệm vụ. – AnandMohanAwasthi