这是我在SO中的第一个问题,我是在BroadcastBlock和ActionBlock中使用DataFlow的新手,我希望我能在这里得到解决方案。这是它的结构。

模型

class SampleModel
{
    public string Id { get; set; } = Guid.NewGuid().ToString();
    public bool Success { get; set; } = true;
    public object UniqueData { get; set; }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine($"Id - {Id}");
        sb.AppendLine($"Success - {Success}");
        sb.AppendLine($"UniqueData - {UniqueData}");
        string tmp = sb.ToString();
        sb.Clear();
        return tmp;
    }
}

DataFlow逻辑

class CreateDownloadTask
{
    public async Task VeryLongProcess()
    {
        await Task.Run(async () =>
        {
            Console.WriteLine("Long Process Working..");
            await Task.Delay(TimeSpan.FromSeconds(5));
            Console.WriteLine("Long Process Done..");
        });
    }

    public async Task CreateSimpleBroadcastX<T>(T data)
    {
        Action<T> process = async model =>
        {
            Console.WriteLine("Working..");
            await VeryLongProcess();
            Console.WriteLine("Done");
        };


        var broad = new BroadcastBlock<T>(null);

        var action = new ActionBlock<T>(process);

        var dflo = new DataflowLinkOptions { PropagateCompletion = true };

        broad.LinkTo(action, dflo);

        await broad.SendAsync(data);

        broad.Complete();

        await action.Completion.ContinueWith(async tsk =>
        {
            Console.WriteLine("Continue data");
        }).ConfigureAwait(false);

        Console.WriteLine("All Done");
    }
}

调用者

var task = cdt.CreateSimpleBroadcastX<SampleModel>(new SampleModel
{
    UniqueData = cdt.GetHashCode()
});
task.GetAwaiter().GetResult();
Console.WriteLin("Completed");

我希望结果应该是

Working..
Long Process Working..
Long Process Done..
Done
Continue data
All Done
Completed

但我得到的是

Working..
Long Process Working..
Continue data
All Done
Completed
Long Process Done..
Done

当ActionBlock中有async-await时,就会发生这种情况。现在,问题是,在没有WaitHandle的情况下,有可能得到我预期的结果吗?

这意味着,ActionBlock.Completion将一直等到ActionDelegate在ActionBlock中完成执行?

或者是我说错了话?

提前感谢,并为我糟糕的英语道歉。

转载请注明出处:http://www.jlunlp.com/article/20230401/2183472.html

随机推荐

  1. 如何仅在第一次输入活动时接收意图,而不接收配置更改?因为getIntent方法在onCreate方法中

    问题是,我直接从其他活动收到的意图是替换先前配置更改中保存的状态,现在这部分代码位于onCreate方法中,这意味着活动要么是第一次加载,要么是在配置更改时调用。我在这里的解决方法(魔术值20)是比较配置更改之前保存的状态是否包含默认值,如...

  2. 如何仅在特定分支和合并请求事件上配置GitLab配置项管道

    在我的gitlab CI yml上,我希望仅在合并请求上执行代码,并且在特定分支的情况下执行代码。只有当我的分支以数字和字符串-release开头时,我才想启动我的处理。例如,12-releaseTest: except: - ...

  3. 如何仅在PWA中显示更新弹出窗口,而不在网站中显示?

    我有一个从零开始创建的Laravel PWA。我使用的是Laravel的Silviolleite插件。我已经创建了一个服务工作者。以下是代码 var staticCacheName = pwa-v + new Date().getTime(...

  4. 如何仅在loopback4中的create entity上要求属性

    我有一个具有必需属性的模型,但仅在创建时需要,在更新时仅需要id属性es。这是我的模型示例:@model() export class MyModel extends Entity { @property({ type: str...

  5. 如何仅在Scala中跟踪某些类的类字段访问?

    我想为Scala程序使用变量跟踪器,它跟踪某些类字段的读取和写入。例如,如果我有一个自定义执行元类,如:class Server extends Actor { var counter = 0 def receive = { ...

  6. 如何仅在mongoose中使用聚合填充嵌套在对象数组中的字段?

    我试图在数组中填充一个嵌套得很深的对象已经有很长一段时间了,但没有成功。我尝试展开数组,但结果数组正在被转换为对象,而不是数组。let aggQuery: any = [ { $match: {} } ...

  7. 如何仅在react-final-form中初始化表单后才订阅字段更改

    我有一个react-final-form表单,它需要从状态初始化。当其中一个字段发生变化时,我希望将表单重置为初始(空)值。因此,我使用dirty字段的订阅状态,如果它发生变化,我使用OnChange重置表单:Field name=opti...

  8. 如何仅在与模式匹配的行中替换字符串?

    我想在包含stringA所属模式的所有文件中用stringB“替换stringA”,并且只在这些行中进行替换。使用sed,我可以替换整个文件中的字符串,而不是行解析。例如:我只想用dest_ip4_addr替换所有这些文件中的那些行(如果该...

  9. 如何仅在Matplotlib中更改绘图的大小,就像在存在绘图的矩形中一样?‘figsize’改变整个图像的大小

    在Python中,figsize‘设置整个图像的大小,所以如果刻度中有两个小数点,那么刻度有4个小数点时,图形的大小是不同的。如何仅设置打印所在矩形的大小,以使打印大小保持不变,而不考虑记号或标签大小?为了进行比较,下面的图像具有相同的无花...

  10. 如何仅在Odoo 10中加载视图后运行javascript

    我在https://www.odoo.com/apps/modules/8.0/web_menu_hide_8.0/上安装了网页隐藏菜单我将其修改为在Odoo 10上使用,但如果我们按下隐藏按钮,表单将调整为全宽,如果我们在按下隐藏按钮后切...