[英]How to save backend execution state and resume it later?
这个怎么样:
private static ConcurrentDictionary<string, TaskCompletionSource<bool>> taskCompletionSources = new ConcurrentDictionary<string, TaskCompletionSource<bool>>();
public IActionResult StartExecution(...)
{
...
Operation(...); // Non-blocking call
...
}
private async Task Operation(...)
{
if(condition) {
if(condition) {
//[wait for input]
var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.LongRunning | TaskCreationOptions.RunContinuationsAsynchronously); // bool or whatever the user response will give us
var uid = // generate some unique id (like Guid.NewGuid())
taskCompletionSources.TryAdd(uid, tcs);
////////////////////////////////////////////////////////////////////
// Now we notify client to update UI with something like SignalR //
////////////////////////////////////////////////////////////////////
var userChoice = await tcs.Task; // Wait until user answers (FinishJob will give us the user choice)
taskCompletionSources.TryRemove(uid, out tcs);
...execute some logic...
}
...execute some logic...
}
...execute some logic...
}
public IActionResult FinishJob(string uid, bool yesNo)
{
if(taskCompletionSources.TryGetValue(uid, out var tcs))
tcs.SetResult(yesNo); // This will unblock the await in Operation()
}
所以基本上当用户按下开始按钮时,它会调用 StartExecution。
StartExecution 触发并忘记操作。
操作完成它的工作,直到它需要更新 UI。 所以它创建了一个等待的 TaskCompletionSource。 它的结果将在用户单击 Continue 时设置它通过 SignalR 执行此操作,同时发送生成的 uid。
UI 更新并存储 uid,然后等待用户按 Continue。
当用户按下 Continue 时,如果用户想要继续作业,它会调用 FinishJob 并传递 uid 和 true。
FinishJob 设置之前实例化的 TaskCompletionSource 的结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.