Tôi muốn thực hiện 10 yêu cầu http không đồng bộ cùng một lúc và chỉ xử lý kết quả khi tất cả đã hoàn thành và trong một hàm gọi lại đơn. Tôi cũng không muốn chặn bất kỳ chủ đề bằng cách sử dụng WaitAll (đó là sự hiểu biết của tôi rằng WaitAll khối cho đến khi tất cả được hoàn thành). Tôi nghĩ rằng tôi muốn thực hiện một IAsyncResult tùy chỉnh mà sẽ xử lý nhiều cuộc gọi. Có phải tôi đang trên đường ray bên phải không? Có bất kỳ tài nguyên hay ví dụ nào ngoài đó mô tả việc xử lý này không?C# nhiều HttpNequest không đồng bộ với một cuộc gọi lại
Trả lời
Tôi thích giải pháp của Darin. Nhưng, nếu bạn muốn một cái gì đó truyền thống hơn, bạn có thể thử điều này.
Tôi chắc chắn sẽ sử dụng một loạt các xử lý chờ đợi và cơ chế WaitAll:
static void Main(string[] args)
{
WaitCallback del = state =>
{
ManualResetEvent[] resetEvents = new ManualResetEvent[10];
WebClient[] clients = new WebClient[10];
Console.WriteLine("Starting requests");
for (int index = 0; index < 10; index++)
{
resetEvents[index] = new ManualResetEvent(false);
clients[index] = new WebClient();
clients[index].OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
clients[index].OpenReadAsync(new Uri(@"http:\\www.google.com"), resetEvents[index]);
}
bool succeeded = ManualResetEvent.WaitAll(resetEvents, 10000);
Complete(succeeded);
for (int index = 0; index < 10; index++)
{
resetEvents[index].Dispose();
clients[index].Dispose();
}
};
ThreadPool.QueueUserWorkItem(del);
Console.WriteLine("Waiting...");
Console.ReadKey();
}
static void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
// Do something with data...Then close the stream
e.Result.Close();
ManualResetEvent readCompletedEvent = (ManualResetEvent)e.UserState;
readCompletedEvent.Set();
Console.WriteLine("Received callback");
}
static void Complete(bool succeeded)
{
if (succeeded)
{
Console.WriteLine("Yeah!");
}
else
{
Console.WriteLine("Boohoo!");
}
}
Hãy xem bài viết này Asynchronous Calls in .NET - Polling or Waiting for Completion
Tôi nghĩ bạn nên sử dụng phương pháp WaitAll. Nếu không, bạn sẽ xử lý 10 cuộc gọi lại IAsyncResult, và sử dụng một semaphore để xác định rằng tất cả 10 cuối cùng đã hoàn thành.
Hãy nhớ rằng WaitAll rất hiệu quả; nó không giống như sự silliness của việc có một sợi "ngủ". Khi một luồng ngủ, nó tiếp tục sử dụng thời gian xử lý. Khi một luồng là "không được lên lịch biểu" bởi vì nó nhấn một WaitAll, thì luồng không còn tiêu tốn bất kỳ thời gian xử lý nào nữa. Nó rất hiệu quả.
Trong bối cảnh của hồ bơi thread IIS, nó vẫn còn sử dụng hoặc nó sẽ được đưa trở lại trong hồ bơi như nó là cho một cuộc gọi không đồng bộ? – aepheus
Trong .NET 4.0 có một đẹp song song Task library cho phép bạn làm những việc như:
using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
class Program
{
public static void Main()
{
var urls = new[] { "http://www.google.com", "http://www.yahoo.com" };
Task.Factory.ContinueWhenAll(
urls.Select(url => Task.Factory.StartNew(u =>
{
using (var client = new WebClient())
{
return client.DownloadString((string)u);
}
}, url)).ToArray(),
tasks =>
{
var results = tasks.Select(t => t.Result);
foreach (var html in results)
{
Console.WriteLine(html);
}
});
Console.ReadLine();
}
}
Như bạn có thể nhìn thấy cho từng url trong danh sách một nhiệm vụ khác nhau được bắt đầu và một lần tất cả các nhiệm vụ được hoàn thành gọi lại được gọi và thông qua kết quả của tất cả các nhiệm vụ.
Thực ra, nó sẽ thực hiện cuộc gọi đồng bộ trong chuỗi công nhân riêng biệt. Để giải quyết vấn đề này, bạn nên sử dụng 'TaskFactory.FromAsync' +' client.BeginGetResponse'. Bằng cách này, các cổng hoàn thành I/O sẽ được sử dụng mà không chặn luồng. – VirusX
- 1. Threading nhiều cuộc gọi không đồng bộ
- 2. Đồng bộ hóa cuộc gọi không đồng bộ trong C#
- 3. Các cuộc gọi lại luôn không đồng bộ?
- 4. javascript: thực hiện một loạt các phương pháp không đồng bộ với một cuộc gọi lại
- 5. Node.js - chờ cho nhiều cuộc gọi không đồng bộ
- 6. Đợi nhiều cuộc gọi lại
- 7. Gọi lại không đồng bộ đồng thời
- 8. Có thể chuyển một cuộc gọi lại thành một khối không đồng bộ không?
- 9. Cuộc gọi đồng bộ với jquery
- 10. Cuộc gọi không đồng bộ Mục tiêu C iphone
- 11. Javascript - đang đợi một số cuộc gọi lại không đồng bộ trở lại?
- 12. Hủy cuộc gọi EJB không đồng bộ @
- 13. Cuộc gọi ủy nhiệm không đồng bộ về lửa và không đồng bộ trong C#
- 14. Cuộc gọi không đồng bộ trong WP7
- 15. Gọi lại đồng bộ và không đồng bộ
- 16. ThreadPool.QueueUserWorkItem với Cuộc gọi không đồng bộ trong chủ đề
- 17. Gói một loạt các cuộc gọi không đồng bộ với một phương thức đồng bộ với giá trị trả về
- 18. Bắt một ngoại lệ được ném vào một cuộc gọi lại không đồng bộ
- 19. Không phải là cuộc gọi đồng bộ chỉ là một cuộc gọi không đồng bộ với một giá trị thời gian chờ nhỏ?
- 20. máy phát/tác vụ task.js so với các cuộc gọi lại không đồng bộ
- 21. Các cuộc gọi HTTP không đồng bộ trong Python
- 22. Cuộc gọi RPC Đồng bộ trong GWT
- 23. Cuộc gọi đến toán tử 'xóa' có đồng bộ không?
- 24. Kiểm tra cuộc gọi phương thức không đồng bộ
- 25. Biến sự kiện thành cuộc gọi không đồng bộ
- 26. Đang đợi nhiều cuộc gọi không đồng bộ để hoàn thành trước khi tiếp tục
- 27. Javascript - đồng bộ hóa sau khi các cuộc gọi không đồng bộ
- 28. Thủ tục lưu trữ không đồng bộ Các cuộc gọi
- 29. Sử dụng .Net Parallel Extensions (Parallel.Invoke) cho nhiều cuộc gọi không đồng bộ?
- 30. Hạn chế các cuộc gọi không đồng bộ trong Node.js
bối cảnh của hoạt động này là gì? Bên trong một trang web? – Keltex
Loại điều này là rất gần tầm thường trong F #. Nó có thể là đáng giá để viết một mô-đun trong F # có thể được gọi từ mã C# ... –
@Keltex nó sẽ là một phần của một ứng dụng web. – aepheus