我将 WCF 服务设置为 PerCall
我想知道如何从客户端发送 Start 调用来启动长时间运行的进程,并发送 Cancel 命令来取消它
我的 WCF 服务看起来像这样
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1 : IService1
{
CancellationTokenSource cancelToken = new CancellationTokenSource();
public void Start()
{
var compute = Task.Factory.StartNew(StartLongRunningTask, cancelToken.Token);
}
public void Stop()
{
cancelToken.Cancel();
}
private void StartLongRunningTask()
{
//process here
}
}
我想这里的问题是,每次调用到达服务器时,它都会被视为一个新请求。
那么在WCF中应该如何启动和取消一个长时间运行的任务呢?
编辑:我将其作为 Windows 服务托管
我将 WCF 服务设置为 PerCall
...这里的问题是,每次调用到达服务器时,它都会被视为一个新请求。
是的,这正是你告诉它要做的事情。如果可以的话,只需更改为InstanceContextMode.PerSession
;然后您就可以做您想做的事情(假设您是自托管)。
如果你做不到这一点,那么你将不得不开发一个更复杂的解决方案,如 @PeterRitchie 评论的那样。首先,您的主机:IIS 的设计目的不是独立于请求进行长时间运行的操作,因此我假设您是自托管的。接下来,您需要一种令牌形式(例如 GUID),它将充当长时间运行的操作的标识符。你的Start
方法将分配一个 GUID 和CancellationTokenSource
并开始操作,您的Stop
方法将采用 GUID 并使用它来查找CancellationTokenSource
并取消操作。您需要一个共享(静态、线程安全)字典来充当查找。
如果你的主机isIIS,那么你的解决方案就会变得更加复杂......:)
首先,您需要一个不托管在 IIS 中的后端。常见的选择是 Azure 辅助角色或 Win32 服务。接下来,您需要一个可靠的通信机制:Azure 队列、MSMQ、WebSphere 等。然后您可以构建 WCF-over-IIS 服务以拥有Start
方法生成一个 GUID 标识符并将消息放入队列中以开始处理。这Stop
方法获取 GUID 并在队列中删除一条消息以取消处理。所有其他逻辑都转移到后端服务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)