如何仅在BroadcastBlock和ActionBlock中使用数据流
这是我在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将一直等到Action
或Delegate
在ActionBlock中完成执行?
或者是我说错了话?
提前感谢,并为我糟糕的英语道歉。
转载请注明出处:http://www.jlunlp.com/article/20230401/2183472.html
随机推荐
-
如何仅在第一次输入活动时接收意图,而不接收配置更改?因为getIntent方法在onCreate方法中
问题是,我直接从其他活动收到的意图是替换先前配置更改中保存的状态,现在这部分代码位于onCreate方法中,这意味着活动要么是第一次加载,要么是在配置更改时调用。我在这里的解决方法(魔术值20)是比较配置更改之前保存的状态是否包含默认值,如...
-
如何仅在特定分支和合并请求事件上配置GitLab配置项管道
在我的gitlab CI yml上,我希望仅在合并请求上执行代码,并且在特定分支的情况下执行代码。只有当我的分支以数字和字符串-release开头时,我才想启动我的处理。例如,12-releaseTest: except: - ...
-
如何仅在PWA中显示更新弹出窗口,而不在网站中显示?
我有一个从零开始创建的Laravel PWA。我使用的是Laravel的Silviolleite插件。我已经创建了一个服务工作者。以下是代码 var staticCacheName = pwa-v + new Date().getTime(...
-
如何仅在loopback4中的create entity上要求属性
我有一个具有必需属性的模型,但仅在创建时需要,在更新时仅需要id属性es。这是我的模型示例:@model() export class MyModel extends Entity { @property({ type: str...
-
如何仅在Scala中跟踪某些类的类字段访问?
我想为Scala程序使用变量跟踪器,它跟踪某些类字段的读取和写入。例如,如果我有一个自定义执行元类,如:class Server extends Actor { var counter = 0 def receive = { ...
-
如何仅在mongoose中使用聚合填充嵌套在对象数组中的字段?
我试图在数组中填充一个嵌套得很深的对象已经有很长一段时间了,但没有成功。我尝试展开数组,但结果数组正在被转换为对象,而不是数组。let aggQuery: any = [ { $match: {} } ...
-
如何仅在react-final-form中初始化表单后才订阅字段更改
我有一个react-final-form表单,它需要从状态初始化。当其中一个字段发生变化时,我希望将表单重置为初始(空)值。因此,我使用dirty字段的订阅状态,如果它发生变化,我使用OnChange重置表单:Field name=opti...
-
如何仅在与模式匹配的行中替换字符串?
我想在包含stringA所属模式的所有文件中用stringB“替换stringA”,并且只在这些行中进行替换。使用sed,我可以替换整个文件中的字符串,而不是行解析。例如:我只想用dest_ip4_addr替换所有这些文件中的那些行(如果该...
-
如何仅在Matplotlib中更改绘图的大小,就像在存在绘图的矩形中一样?‘figsize’改变整个图像的大小
在Python中,figsize‘设置整个图像的大小,所以如果刻度中有两个小数点,那么刻度有4个小数点时,图形的大小是不同的。如何仅设置打印所在矩形的大小,以使打印大小保持不变,而不考虑记号或标签大小?为了进行比较,下面的图像具有相同的无花...
-
如何仅在Odoo 10中加载视图后运行javascript
我在https://www.odoo.com/apps/modules/8.0/web_menu_hide_8.0/上安装了网页隐藏菜单我将其修改为在Odoo 10上使用,但如果我们按下隐藏按钮,表单将调整为全宽,如果我们在按下隐藏按钮后切...