如何等待线程池中的特定线程

本文关键字:线程 何等待 等待 | 更新日期: 2023-09-27 18:18:18

我有一个同步任务,但有时线程在进行远程调用时卡住,这会阻塞执行。因此,我想使用ThreadPool线程进行远程调用,但我的想法是尽可能保持同步,也就是说,我希望主线程等待超时值或ThreadPool线程完成,以便该活动仅在线程卡住的情况下是异步的。ThreadPool线程没有给出任何句柄,所以我可以调用thread.join(timeout),我也不能使用自动复位事件,因为这部分代码可以由多个线程访问,所以哪个线程设置/重置自动复位事件变得更加复杂,这也是一个开销。

对于这个问题,你能建议一个更简洁的方法吗?我也不能使用Thread类创建Thread,因为正如我上面提到的,代码区域可以被多个线程访问,远程调用做的是一个小任务,就像更新像进度这样的文本。

代码片段:

public static Exception AddProgress(Session session, ITaskSetProgress progress)
{
  IIconUIServer server = IconRemotingServer.Instance.GetUiServer(session);//gets remote proxy object
  server.AddProgress(progress);// calls a method over remoting IPC channel 
}

这个方法可以被多个线程同时调用。

我的意图是写AppProgressAsync方法,这样当调用server.AddProgress(progress);挂起时,只有它应该表现为异步,所以我有一个超时。

我不能使用任务库,因为我需要支持那些仍然使用。net 3.5的老客户。

如何等待线程池中的特定线程

我通过使用异步委托解决了这个问题:如下所示:

AddProgressAsync(Session Session, ITaskSetProgress进度){addProgress = new AddProgressDelegate(addProgress);
        try
        {
            IAsyncResult result = addProgress.BeginInvoke(session, progress, null, null);
           result.AsyncWaitHandle.WaitOne(timeoutValue);

        }
        catch (Exception ex)
        {
        }
        finally
        {
            addProgress = null;
        }

    }

public static void AddProgress(Session Session, ITaskSetProgress进度){iiconusererver server = IconRemotingServer.Instance.GetUiServer(session);//获取远程代理对象server.AddProgress(progress);//通过远程IPC通道调用方法}

在这种情况下工作得很好!!