2010-11-10 36 views
7

Tôi gặp lỗi trong ứng dụng của mình dường như chỉ hiển thị khuôn mặt khi tôi tạm dừng ứng dụng trong trình gỡ lỗi trong vài phút. Tôi nghi ngờ điều này là do một thư viện mạng bên thứ ba tôi đang sử dụng có một sợi nhịp tim, mà sẽ bị ngắt kết nối khi nó không thể ping máy chủ trong khi đó là nhịp tim thread được tạm dừng.Tạm dừng tất cả chuỗi trong quy trình hiện tại tại thời điểm chạy

Tôi đang cố gắng viết một ứng dụng trường hợp thử nghiệm để xác minh rằng đây là nguyên nhân của lỗi. Để làm như vậy, tôi cần một cách để tạm dừng tất cả các chủ đề trong ứng dụng (mà sau này tôi sẽ thu hẹp để tạm dừng chỉ luồng mà tôi nghi ngờ có thể là chuỗi nhịp tim) để mô phỏng tạm dừng ứng dụng trong trình gỡ rối.

Có ai biết cách thực hiện việc này không? Thậm chí có thể cho một sợi tơ khác gây ra ngủ không?

Cảm ơn, Alex

UPDATE:

tôi đã kết thúc quyết định rằng tôi đã không thực sự cần một ứng dụng để làm điều này đối với tôi, nhìn thấy như là điểm đã được chỉ để xác minh rằng tạm dừng trong trình gỡ lỗi đã gây ra sự ngắt kết nối. Vì vậy, đây là những gì tôi đã làm ... (Những cách đơn giản nhất thường là tốt nhất ... hoặc ít nhất là đơn giản nhất ...)

private static void Main(string[] args) 
    { 
     IPubSubAdapter adapter = BuildAdapter(); 
     bool waitingForMessage; 
     adapter.Subscribe(_topic, message => waitingForMessage = false, DestinationType.Topic); 
     Stopwatch timePaused = new Stopwatch(); 
     while (adapter.IsConnected) 
     { 
      Console.WriteLine("Adapter is still connected"); 
      waitingForMessage = true; 
      adapter.Publish(_topic, "testmessage", DestinationType.Topic); 
      while (waitingForMessage) 
      { 
       Thread.Sleep(100); 
      } 
      timePaused.Reset(); 
      timePaused.Start(); 
      Debugger.Break(); 
      timePaused.Stop(); 
      Console.WriteLine("Paused for " + timePaused.ElapsedMilliseconds + "ms."); 
      Thread.Sleep(5000); // Give it a chance to realise it's disconnected. 
     } 
     Console.WriteLine("Adapter is disconnected!"); 
     Console.ReadLine(); 
    } 

Và kết quả:

Adapter is still connected 
Paused for 10725ms. 
Adapter is still connected 
Paused for 13298ms. 
Adapter is still connected 
Paused for 32005ms. 
Adapter is still connected 
Paused for 59268ms. 
Adapter is disconnected! 

Trả lời

4

Bạn có thể sử dụng điều này để nhanh chóng xác định các chủ đề của quá trình của bạn:

using System.Diagnostics; 

ProcessThreadCollection threads = Process.GetCurrentProcess().Threads; 

Sau đó, bạn có thể use kernel32.dll with P/Invoke để làm bất cứ điều gì bạn cần với những chủ đề đó. Sử dụng OpenThread để có được một xử lý cho các chủ đề mong muốn và sau đó đình chỉ nó với SuspendThread sử dụng tay cầm đó.

Dưới đây là những lời tuyên bố P/Gọi cho hai phương pháp:

[DllImport("kernel32.dll")] 
static extern IntPtr OpenThread(uint dwDesiredAccess, bool bInheritHandle, uint dwThreadId); 

[DllImport("kernel32.dll")] 
static extern uint SuspendThread(IntPtr hThread); 
+0

Có vẻ hứa hẹn, cảm ơn, tôi sẽ trả lại số này – AlexC

+0

Vui lòng quay lại đây và cho chúng tôi biết nếu nó hoạt động. :) – bitbonk

+2

Bạn cũng cần GetCurrentThreadId() để bạn không bị treo. Ngưng ngẫu nhiên là khá có khả năng, không phân bổ bất cứ điều gì. –

0

Bạn có thể gọi Thread.Suspend sau đó Thread.Resume phương pháp nhưng những người phản đối và không recommneded để sử dụng chúng.

Nhưng bạn có thể thực hiện các thao tác sau: Có cờ boolean khi đặt bạn đặt luồng của mình vào chế độ ngủ lớn. HOẶC Tốt hơn để sử dụng ManualResetEvent.

+0

Cảm ơn, mặc dù cho điều này, tôi sẽ cần phải nhận được ahold của tất cả các đối tượng Thread để làm điều này, mà tôi không thể tìm thấy một điều tra viên cho. (Process.Threads trả về một tập hợp các ProcessThreads, không phải là Threads) – AlexC

1

Bạn có thể tạm dừng chủ đề bằng cách gọi Thread.Suspend. Tài liệu cho phép "KHÔNG LÀM NÀY!" cảnh báo không dùng nữa, nhưng tôi nghĩ rằng bạn là trường hợp sử dụng hợp lệ.

Jon Skeet nghĩ rằng you can't enumerate managed threads trong mã C# bình thường, mặc dù anh ta gợi ý một giải pháp có thể.

+0

Đồng ý: đây là trường hợp sử dụng hợp lệ cho Suspend. –

+0

Cảm ơn, mặc dù cho điều này, tôi sẽ cần phải nhận được ahold của tất cả các đối tượng Thread để làm điều này, mà tôi không thể tìm thấy một điều tra viên cho. (Process.Threads trả về một tập hợp các ProcessThreads, không phải là Threads) – AlexC

1

Tôi giả sử bạn sẽ không tạm dừng tất cả các chủ đề trong ứng dụng, nếu không sẽ không có gì chạy để hủy tạm ngưng chúng. Hay tôi đã bỏ lỡ điều gì đó?

Đề xuất: Thử đặt tên cho tất cả các chuỗi bạn tạo. Bất kỳ chủ đề nào không có tên hoặc không khớp với quy ước đặt tên của bạn, phải được tạo bởi một thành phần của bên thứ ba. Điều này có thể đưa bạn đến nguyên nhân gốc nhanh hơn mà không phải tạm dừng nhiều luồng.

+0

Vâng, tôi cần tạm dừng tất cả các luồng trừ Thread.CurrentThread, sau đó ngủ cho [insert time here], sau đó tiếp tục tất cả các luồng. – AlexC

1

Từ pov của tôi, điều này nghe có vẻ không đúng.

  • Bạn đang viết loại bài kiểm tra nào? Nếu bạn đang nói về kiểm tra đơn vị, thì đây không phải là trường hợp kiểm tra đơn vị - âm thanh giống như kiểm tra tích hợp
  • Xem xét cách ly các cuộc gọi API trong một lớp và sau đó sử dụng tiêm phụ thuộc để bạn có thể kiểm tra mà không cần thư viện của bên thứ ba mocks/stubs và cũng có thể kích động/kiểm tra một ngoại lệ được nêu ra từ thư viện của bên thứ 3
+0

Cũng nói. Nhưng có lẽ đã quá muộn rồi. – bitbonk

+0

Đây không phải là thử nghiệm đơn vị hoặc thử nghiệm tích hợp. Tôi chỉ muốn một ứng dụng nhỏ để xác minh rằng vấn đề đã được gây ra bằng cách nhập trình gỡ lỗi (và rằng nó không được gây ra bởi các phần mềm tôi đang phát triển). Thư viện của bên thứ ba được bao bọc trong API tùy chỉnh như bạn đã đề xuất (và tôi sử dụng DI trong các bài kiểm tra đơn vị ứng dụng của mình vì lý do bạn đề xuất) nhưng không có ngoại lệ nào được nâng lên từ thư viện của bên thứ ba và lỗi không thể sao chép được bằng cách một số lệnh gọi API theo một thứ tự cụ thể, rất khó để xem cách tiêm phụ thuộc có thể trợ giúp ở đây như thế nào? – AlexC

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