如何等待Threadpool的特定线程

时间:2014-08-16 01:58:12

标签: c# multithreading

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

您能为这个问题建议一个更清洁的方法吗? 我也不能使用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的老客户。

1 个答案:

答案 0 :(得分:0)

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

public static void AddProgressAsync(Session session,ITaskSetProgress progress)         {             AddProgressDelegate 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 progress) {   IIconUIServer server = IconRemotingServer.Instance.GetUiServer(session); //获取远程代理对象   server.AddProgress(progress); //通过远程处理IPC通道调用方法 }

在这种情况下工作正常!!