我有一个同步任务,但有时候线程会在进行远程执行时阻塞执行的远程调用。所以我想使用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的老客户。
答案 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通道调用方法 }
在这种情况下工作正常!!