2012-12-15 33 views
5

Tôi khá mới với asp.net và C# nên chịu với tôi. Ngoài ra xin lỗi của tôi nếu điều này đã được yêu cầu trước khi ... nếu vậy xin vui lòng hướng dẫn tôi đến một trang đó là giúp đỡ.asp.net C# ajax chạy công việc hàng loạt 'async'

Những gì tôi có:

  • Một trang: Với 4 UpdatePanels

    1. UpdatePanel 1st, trong đó có một (item) GridView, tùy chọn người dùng hiển thị (không quan trọng cho câu hỏi này) và nút thực hiện tìm kiếm cơ sở dữ liệu trả về một danh sách các mục được hiển thị trên lưới. Người dùng chọn một mục trên lưới này ...

    2. Cập nhật thứ haiPanel chứa danh sách thả xuống chứa danh sách tác vụ sẵn có được tải từ XML. Người dùng sẽ chọn một nhiệm vụ, hiển thị một loạt các tùy chọn/tham số có sẵn (cũng được tải từ tệp XML) sang một khung nhìn khác (tham số) trong lần cập nhật thứ 2. Gridview ở đây sẽ luôn có một hàng dữ liệu. Tôi đang sử dụng GridView ở đây vì nó dễ dàng hơn là tạo các điều khiển động (các paramaters khác nhau đối với mỗi nhiệm vụ). Người dùng có thể nhập các giá trị tham số vào lưới. Người dùng nhấp vào nút Thêm và tác vụ được thêm vào một khung nhìn khác trong bảng cập nhật thứ 3.

    3. Cập nhật thứ baPanel chứa một khung nhìn (nhiệm vụ) chứa tất cả tác vụ được người dùng thêm. Ngoài ra còn có một nút được cho là để chạy hàng loạt tất cả các nhiệm vụ. Khi nút được bấm, nó đi qua khung nhìn (nhiệm vụ) đang tìm kiếm nhiệm vụ đang chờ xử lý để chạy. Đối với mỗi tác vụ đang chờ xử lý, nó gọi một dịch vụ web xử lý tác vụ một cách thích hợp. Dịch vụ Web trả về kết quả nhiệm vụ cùng với đầu ra bản ghi.

    4. 4th UpdatePanel hiện chỉ chứa div hiển thị đầu ra nhật ký được trả về từ dịch vụ web.

Những gì tôi muốn tiếp tục làm việc và không biết làm thế nào là:

  • làm thế nào để thực hiện một công việc hàng loạt 'không đồng bộ? Những gì tôi đang cố gắng đạt được là, khi người dùng nhấp vào nút chạy hàng loạt, bản cập nhật thứ 3 (nhiệm vụ) cùng với tất cả điều khiển của nó bị vô hiệu hóa trong khi công việc hàng loạt chạy 'đằng sau cảnh'. Tùy thuộc vào nhiệm vụ, mỗi tác vụ có thể mất tối đa 5 giây mỗi tác vụ. Nếu người dùng đã tạo 60 tác vụ, tôi nghĩ điều này cũng sẽ khiến trang hết thời gian chờ?
  • Trong khi công việc hàng loạt đang chạy, người dùng có thể tìm kiếm thêm các mục khác trong (mục) UpdatePanel và thêm nhiệm vụ mới bằng cách sử dụng (tham số) updatepanel vào (nhiệm vụ) updatepanel.
  • (Tác vụ) UpdatePanel sẽ hiển thị lớp phủ 'Đang thực hiện ...' của một số loại khi công việc đang chạy.

Hy vọng bạn hiểu câu hỏi của tôi. Nhiều đánh giá cao nếu ai đó có thể được loại, đủ để cung cấp cho một số hướng dẫn và/hoặc hướng dẫn về cách để giải quyết nhiệm vụ này

thông tin bổ sung:

Sử dụng Framework 3.5

Sử dụng Asp.net C# + Ajax

Dịch vụ web là của gSoap trên hộp solaris

Rất cám ơn trước.


Xin lỗi vì đã là một noob, tôi đã cố gắng trả lời sự giúp đỡ của bạn nhưng thấy rằng có giới hạn ký tự mà tôi có thể đăng nhập. Tôi sẽ chỉ cập nhật nhận xét của riêng mình bây giờ.

Cảm ơn đề xuất của bạn. Xin lỗi vì câu trả lời trễ, tôi đã nhìn xung quanh một ngày khác và đã thực hiện một số thay đổi, làm cho nó hoạt động với 'PageAsyncTask' và 'IAsyncResult'. Tôi đã tạo một lớp dịch vụ web sẽ được gọi bởi trang. Lớp dịch vụ web mới sẽ được gọi là dịch vụ web gSoap. Tôi đã quản lý một số loại chạy nó 'không đồng bộ'.

Tôi có một nút mà thực hiện:

protected void StartASyncJob() 
    { 
    PageAsyncTask task = new PageAsyncTask(
     new BeginEventHandler(BeginAsyncCommandTask), 
     new EndEventHandler(EndAsyncCommandTask), 
     new EndEventHandler(AsyncCommandTaskTimeOut), null); 

    RegisterAsyncTask(task); 
    } 

BeginAsyncCommandTask sẽ đi qua lưới, có nhiệm vụ cấp phát đầu tiên và gọi dịch vụ web.

EndAsyncCommandTask sau đó sẽ truy xuất kết quả trả về, viết ra (log) UpdatePanel. Sau đó nó sẽ thực thi StartASyncJob() một lần nữa tìm kiếm bản ghi đang chờ xử lý tiếp theo để xử lý.

Tất cả điều này chỉ hoạt động nếu không làm bất cứ điều gì khác trên trang. Nếu tôi (trong khi quá trình không đồng bộ đang chạy) để thực hiện tìm kiếm thêm các mục trong GridView (mục) hoặc chọn một nhiệm vụ mới từ danh sách thả xuống (nhiệm vụ), sự kiện sẽ không kích hoạt cho đến khi quá trình dịch vụ web không đồng bộ hoàn tất. Và khi nó được hoàn thành, danh sách thả xuống hoặc sự kiện tìm kiếm kích hoạt, chi tiết nhật ký của tôi được trả về từ dịch vụ web không được cập nhật.

Tôi đoán 'chờ' được gây ra bởi 'PageAsyncTask' là 'đẻ trứng' từ cùng một chuỗi trang?

Tôi đã nghĩ rằng có dịch vụ web 'không đồng bộ' sẽ cho phép người dùng thực hiện nhiều việc cùng một lúc để mang lại trải nghiệm người dùng tốt hơn. Nhưng có vẻ như tôi sai và/hoặc đã không làm đúng.

Tôi chưa thử đề xuất của bạn về việc sử dụng QueueUserWorkItem; nhưng trước khi tôi làm, tôi có thể hỏi nếu nó sẽ cung cấp hiệu ứng tương tự như sử dụng 'PageAsyncTask'. Việc sử dụng QueueUserWorkItem có tác dụng giống như 'sinh sản từ cùng một chuỗi trang' không?

Rất cám ơn trước. Xin lỗi nếu tôi đã không giải thích bản thân mình tốt và xin vui lòng cho tôi biết nếu bạn cần tôi để gửi mã của tôi.

Trả lời

2

có một vài giải pháp, nhưng phụ thuộc vào mức độ kiểm soát bạn có trên máy chủ.

  1. Nếu bạn có toàn quyền kiểm soát máy chủ, bạn có thể tạo một ứng dụng riêng sẽ quản lý Công việc; ứng dụng có thể là Dịch vụ Windows và giao tiếp giữa trang của bạn và ứng dụng sẽ là cơ sở dữ liệu hoặc MSMMQ (giao tiếp chủ yếu có nghĩa là danh sách Nhiệm vụ và trạng thái của chúng - 1. được thực thi, 2. thực thi 3. hoàn tất).

  2. Một giải pháp khác là trong trường hợp bạn không có toàn quyền kiểm soát truy cập vào máy chủ, nhưng nó sẽ yêu cầu phải thực hiện một số giao tiếp giữa các luồng. Thay vì có ứng dụng tôi đã mô tả ở điểm 1.bạn có thể có một chủ đề riêng biệt, có thể được bắt đầu theo cách này:

    System.Threading.ThreadPool.QueueUserWorkItem(foo => LauchTaskRunner()); 
    

    Giả sử bạn thực hiện một phương pháp gọi là LaunchTaskRunner mà trong một vòng lặp chỉ xử lý danh sách các công việc hiện tại, dòng trên sẽ bắt đầu nó thành một quá trình riêng biệt . Bạn có thể giao tiếp với phương pháp này (mà đang chạy trong một thread riêng biệt) thông qua một số biến tĩnh (khai báo trong trang), ví dụ:

    public class YourPage : System.Web.UI.Page{ 
        static IList<Task> tasks; 
        static void LauchTaskRunner(){ 
        // here make use of tasks variable 
        } 
    } 
    

    Everytime (nhiệm vụ) updatepanel được làm mới, nó nên render dựa trên nhiệm vụ biến.

+0

Cảm ơn câu trả lời của bạn. Tôi đã nhập một số nhận xét bổ sung về bài đăng gốc của mình về tiến trình của tôi – user1905597

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