2012-03-05 59 views
57

Có một thiết lập ứng dụng mới trong asp.net 4,5Ý nghĩa của "UseTaskFriendlySynchronizationContext" là gì?

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 

mã như thế này có thể chạy trong asp.net 4,0

protected void Button1_Click(object sender, EventArgs e) 
{ 
    CallAysnc(); 
} 

public void CallAysnc() 
{ 
    AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(Guid.NewGuid().ToString()); 

    WebClient client = new WebClient(); 
    client.DownloadStringCompleted += (object sender, DownloadStringCompletedEventArgs e) => 
    { 
     asyncOp.PostOperationCompleted(CallCompleted, e.Result); 
    }; 
    client.DownloadStringAsync(new Uri("http://www.google.com")); 
} 

private void CallCompleted(object args) 
{ 
    Response.Write(args.ToString()); 
} 

Nhưng nó không hoạt động trong asp.net 4.5, và khi tôi xóa ứng dụng mới, nó hoạt động trở lại!

Vậy ý nghĩa của "UseTaskFriendlySynchronizationContext" là gì?

Trả lời

62

Về UseTaskFriendlySynchronizationContext, từ Microsoft Forums:

Điều đó nói với ASP.NET sử dụng một đường ống dẫn không đồng bộ hoàn toàn mới mà sau ước CLR cho đá ra khỏi hoạt động không đồng bộ, bao gồm trở về chủ đề để ThreadPool khi cần thiết. ASP.NET 4.0 và dưới đây tuân thủ các quy ước riêng của mình đi ngược lại hướng dẫn CLR và nếu chuyển đổi không được bật, thì rất dễ dàng cho các phương pháp không đồng bộ để chạy đồng bộ, bế tắc yêu cầu hoặc không hoạt động như mong đợi.

Ngoài ra, tôi nghĩ rằng AsyncOperationManager là dành cho các ứng dụng dành cho máy tính để bàn. Đối với ứng dụng ASP.NET, bạn nên sử dụng RegisterAsyncTask và đặt <%@ Page Async="true", see here for more details.

Vì vậy, bằng cách sử dụng c mới # từ khóa ví dụ của bạn sẽ là:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    RegisterAsyncTask(new PageAsyncTask(CallAysnc)); 
} 

private async Task CallAysnc() 
{ 
    var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com"); 
    Response.Write(res); 
} 

Mục đích là để hỗ trợ thông tin sau bằng phát hành nhưng hiện chưa được hỗ trợ trong phiên bản beta:

protected async void Button1_Click(object sender, EventArgs e) 
{ 
    var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com"); 
    Response.Write(res); 
} 
+0

Tôi đã sử dụng mã đích và hoạt động tốt. Làm thế nào để biết nó hiện không được hỗ trợ? Tình huống nào không hỗ trợ? – Dozer

+1

@Dozer, tôi đoán bạn không có UseTaskFriendlySynchronizationContext được đặt thành true? Tôi nhận được một lỗi về Phản hồi không có sẵn (dễ dàng để giải quyết nhưng không phải nếu điều khiển bạn không thể thay đổi được mã hóa để truy cập vào nó).Nếu bạn theo liên kết đó đến Diễn đàn Microsoft, bạn có thể đọc về một số vấn đề tôi có và nhận xét về nó không được nhân viên của Microsoft hỗ trợ. Tôi có ấn tượng rằng nó không tự động cắm vào RegisterAsyncTask nhưng do các vấn đề (không biết cái gì, nhưng bạn có thể hỏi trong diễn đàn đó) và nếu không thì bạn sẽ không nhận được lợi ích nào khi chạy nó một cách đồng bộ. – Michael

+0

Câu trả lời trong MSDN cho biết: "Trong ví dụ cụ thể của bạn, có một phương thức void async mà không cần thiết lập công tắc thực sự giới thiệu một điều kiện chủng tộc trong Trang của bạn, mà phương thức DataBind() không được đảm bảo để được gọi trước khi Trang thực sự được hiển thị và đầu ra của nó được gửi tới máy khách ". Nhưng tôi đã thử nó và trang luôn hiển thị sau phương thức DataBind(). – Dozer

7

Thông tin chi tiết, trích dẫn từ ASP.NET 4.5.1 documentation for appSettings trên MSDN:

aspnet: UseTaskFriendl ySynchronizationContext

Chỉ định cách đường dẫn mã không đồng bộ trong ASP.NET 4.5 hoạt động.

...

Nếu giá trị quan trọng này được thiết lập là false [default], đường dẫn mã không đồng bộ trong ASP.NET 4.5 cư xử như họ đã làm trong ASP.NET 4.0. Nếu giá trị khóa này được đặt thành true, ASP.NET 4.5 sử dụng đường dẫn mã được tối ưu hóa cho API trả về tác vụ. Đặt công tắc tương thích này là bắt buộc đối với các ứng dụng hỗ trợ WebSockets, để sử dụng tính năng đồng bộ dựa trên tác vụ trong các trang Biểu mẫu web và đối với một số hành vi không đồng bộ khác .