Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET无状态并行工作流/长并行后台进程_C#_State Machine_Stateless State Machine - Fatal编程技术网

C# .NET无状态并行工作流/长并行后台进程

C# .NET无状态并行工作流/长并行后台进程,c#,state-machine,stateless-state-machine,C#,State Machine,Stateless State Machine,我有一个stateMachine,需要在State.LoadingOrderInfos后台下载大量数据。当我的应用程序在后台下载内容时,操作员应该继续工作并查看下一个状态。 在State.InsertPcbs我需要下载的数据 简而言之。我想在进入状态时调用LoadECMDataAsync。LoadingOrderInfos不应干扰正常的工作流 我想我应该创建一个服务类来获取您需要的数据,也许您可以使用Task.Run int这个类来启动这个过程 完成后,它可以设置一个可检查的标志。或者你可以让

我有一个
stateMachine
,需要在
State.LoadingOrderInfos
后台下载大量数据。当我的应用程序在后台下载内容时,操作员应该继续工作并查看下一个
状态
。 在
State.InsertPcbs
我需要下载的数据

简而言之。我想在进入
状态时调用
LoadECMDataAsync
。LoadingOrderInfos
不应干扰正常的工作流


我想我应该创建一个服务类来获取您需要的数据,也许您可以使用Task.Run int这个类来启动这个过程

完成后,它可以设置一个可检查的标志。或者你可以让它调用回调

然后使用PermitIf检查是否已设置标志

你的问题很严重,所以我认为把责任分开是有道理的

顺便说一句,您正在使用OnActivate。仅当您需要“激活”状态机时才应使用此选项,如从存储器重新加载状态机。目前,它的工作原理类似于OnEntry(所以使用它),但我想改变它

_machine.Configure(State.LoadingOrderInfos)
    .Ignore(Trigger.WtPresent)
    .Ignore(Trigger.WtNotPresent)
    .SubstateOf(State.CanLogOut)
    .Permit(Trigger.OrderLoadingFailed, State.OrderNotSelected)
    .Permit(Trigger.OrderLoadingComplete, State.OrderCheckSetup)
    .OnEntry(() =>
    {
        IsLoading = true;
        Wt = null;
    })
    // Is this the way how to do it?
    .OnEntry(() =>
    {
        LoadECMDataAsync();
    })
    .OnActivate(async () =>
    {
        if (await _LoadOrderInfos().ConfigureAwait(true))
        {
            _machine.Fire(Trigger.OrderLoadingComplete);
        }
        else
        {
            _machine.Fire(Trigger.OrderLoadingFailed);
        }
    })
    .OnExit(() => IsLoading = false);