Nếu bạn không muốn chặn các chủ đề chính, bạn có thể sử dụng một System.Threading.Timer:
private Thread _thread;
void Main(string[] args)
{
_thread = new ThreadStart(ThreadEntry);
_thread.Start();
Timer timer = new Timer(Timeout,null,30000,Timeout.Infinite);
}
void ThreadEntry()
{
int result = obj.PerformInitTransaction();
}
void TimeOut(object state)
{
// Abort the thread - see the comments
_thread.Abort();
throw new ItTimedOutException();
}
Jon Skeet có một cách ít mạnh mẽ (Shutting Down Worker Threads Gracefully) ngăn chặn các chủ đề hơn hủy bỏ.
Tuy nhiên, vì bạn không kiểm soát hoạt động PerformInitTransaction()
đang làm ở đó, bạn không thể làm gì nhiều khi hủy bỏ và rời khỏi đối tượng ở trạng thái không hợp lệ. Như đã đề cập nếu bạn có thể xóa mọi thứ hủy bỏ PerformInitTransaction
đã bị treo, bạn có thể thực hiện việc này bằng cách bắt số ThreadAbortException
, mặc dù vì đó là cuộc gọi của bên thứ 3, điều đó có nghĩa là đoán trạng thái bạn đã để phương thức của mình.
PerformInitTransaction
thực sự là thiết bị cung cấp thời gian chờ.
Nguồn
2010-02-15 12:06:35
@Bomboca: Tôi cuộn lại chỉnh sửa của bạn, 'Exception' Tôi ném không phải là một' ThreadAbortException', mà là một cái gì đó ném bởi CLR khi có cuộc gọi để 'Hủy bỏ 'được thực hiện. –
xin lỗi về điều đó và cảm ơn cho đầu vào :) –
Đó là một cuộc gọi chặn, nếu bạn cần chủ đề chính làm những việc khác tại thời điểm này, điều này sẽ không hoạt động! – feldeOne