Tôi có một thao tác không đồng bộ vì nhiều lý do cần được kích hoạt bằng cách sử dụng một cuộc gọi HTTP đến một trang web ASP.NET. Khi trang của tôi được yêu cầu, nó sẽ bắt đầu hoạt động này và ngay lập tức trả lại một xác nhận cho khách hàng.Chạy một hoạt động không đồng bộ được kích hoạt bởi một yêu cầu trang web ASP.NET
Phương pháp này cũng được hiển thị qua dịch vụ web WCF và nó hoạt động hoàn hảo.
On nỗ lực đầu tiên của tôi, một ngoại lệ được ném ra, nói với tôi:
Asynchronous operations are not allowed in this context. Page starting an asynchronous operation has to have the Async attribute set to true and an asynchronous operation can only be started on a page prior to PreRenderComplete event.
Vì vậy, tất nhiên tôi đã thêm tham số Async="true"
để chỉ thị @Page
. Bây giờ, tôi không gặp lỗi, nhưng trang đang chặn cho đến khi thao tác Không đồng bộ hoàn tất.
Làm thế nào để tôi có được một trang thực sự hoạt động?
Chỉnh sửa: Một số mã để biết thêm thông tin. Đó là một chút phức tạp hơn này, nhưng tôi đã cố gắng để có được ý tưởng chung trong đó.
public partial class SendMessagePage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string message = Request.QueryString["Message"];
string clientId = Request.QueryString["ClientId"];
AsyncMessageSender sender = new AsyncMessageSender(clientId, message);
sender.Start();
Response.Write("Success");
}
}
Lớp AsyncMessageSender:
public class AsyncMessageSender
{
private BackgroundWorker backgroundWorker;
private string client;
private string msg;
public AsyncMessageSender(string clientId, string message)
{
this.client = clientId;
this.msg = message;
// setup background thread to listen
backgroundThread = new BackgroundWorker();
backgroundThread.WorkerSupportsCancellation = true;
backgroundThread.DoWork += new DoWorkEventHandler(backgroundThread_DoWork);
}
public void Start()
{
backgroundThread.RunWorkerAsync();
}
...
// after that it's pretty predictable
}
Khó trả lời mà không thấy mã gọi hoạt động không đồng bộ này. – Bryan
Ok, tôi sẽ cập nhật câu hỏi với nhiều thông tin hơn. Cảm ơn. – Damovisa
Trên Azure, bạn có thể sử dụng Công việc Web. Xem http://curah.microsoft.com/52143/using-the-webjobs-feature-of-windows-azure-web-sites Các chủ đề nền trên ASP.NET có vấn đề. – RickAndMSFT