5

Tôi có một phương pháp như thế này:Make phương pháp không đồng bộ tự

public List<List<string>> GroupedNodes(string URL, params string[] XPathes) 
{ 
    //Load HTML Source 
    HtmlWeb loader = new HtmlWeb(); 
    HtmlAgilityPack.HtmlDocument doc = loader.Load(URL); 

    //some other codes ... 

    //Return result as a List of list 
    return grouped; 
} 

tôi sử dụng HtmlAgilityPack để có được nguồn html từ một địa chỉ.

Nhưng khi tôi sử dụng phương pháp này, nó gây ra đóng băng chương trình.

Tôi biết tôi có thể sử dụng đa luồng khi tôi gọi phương pháp này trong giao diện người dùng NHƯNG Tôi muốn viết phương pháp của tôi trong một cách để được đồng bộ & Responsive tự và khi chúng ta sử dụng nó, nó hoạt động mà không đóng băng.

Ý tôi là nếu ai đó sử dụng phương pháp của tôi và anh ấy/cô ấy không biết đa luồng, tôi muốn chương trình của anh ấy không đóng băng, nói cách khác, tôi không muốn gọi Phương thức của tôi bằng một chuỗi hoặc công việc !

Trả lời

0

Sử dụng AsyncCallback

tìm ở đây tôi nghĩ phần này của câu trả lời là những gì bạn muốn: Callback Mẫu

What is AsyncCallback?

với một chút thay đổi và suy nghĩ bạn có thể sử dụng nó với phương pháp của bạn

+0

Câu trả lời này quá chung chung và đi ngược lại thực tiễn được chấp nhận trong C#, đó là sử dụng 'async'-'await'. – svick

1

Thông thường, đúng cách sẽ sử dụng async tương đương với các phương thức IO mà bạn đang sử dụng (như Load()). Nhưng HtmlAgilityPack dường như không hỗ trợ async (ít nhất là không có trong phiên bản .Net 4.5 của nó).

này có nghĩa là lựa chọn tốt nhất là để chạy phương pháp của bạn trên thread khác và yêu cầu người gọi sử dụng async-await:

Ví dụ, việc thực hiện có thể nhìn như thế này:

private List<List<string>> GroupedNodes(string URL, params string[] XPathes) 
{ 
    //Load HTML Source 
    HtmlWeb loader = new HtmlWeb(); 
    HtmlAgilityPack.HtmlDocument doc = loader.Load(URL); 

    //some other codes ... 

    //Return result as a List of list 
    return grouped; 
} 

public Task<List<List<string>>> GroupedNodesAsync(string URL, params string[] XPathes) 
{ 
    return Task.Run(() => GroupedNodes(URL, XPathes)); 
} 

Nếu không sử dụng async - await, không có cách nào tốt để làm cho phương pháp của bạn không chặn chuỗi cuộc gọi.

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