我目前正在使用 Channels 构造(如 goroutine)来管理多线程状态同步。
我很好奇如何使用该通道处理状态管理的不同操作的最佳实践。一种操作可能是检索,另一种可能是从磁盘重新加载该状态。
在使用单个通道支持多个操作并为这些操作提供参数支持时,我感到相当多的摩擦和复杂性。特别支持不同的返回类型和该通道内每个操作决策路径内的转换。
有人可以推荐一些替代方法还是这个概念就足够了?
这是一个例子:
private static readonly Dictionary<string, OmaObject> State = new Dictionary<string, OmaObject>();
private static readonly ISpookyHashV2 SpookyHashV2 = SpookyHashV2Factory.Instance.Create();
public static ChannelReader<T> CreateScheduleMessenger<T>(ChannelReader<T> channelReader,
Command command)
{
var output = Channel.CreateUnbounded<T>();
Task.Run(async () =>
{
if (command is Command.Get)
{
var raw = await channelReader.ReadAsync();
OmaObject omaObject = (OmaObject)Convert.ChangeType(raw, typeof(OmaObject));
var hash = SpookyHashV2.ComputeHash($"{omaObject.Customer}{omaObject.Device}{omaObject.TestName}").AsBase64String();
if (!State.ContainsKey(hash))
State.Add(hash, omaObject);
Console.WriteLine($"Schedule state count: {State.Count}");
await output.Writer.WriteAsync((T)omaObject);
} else if (command is Command.Delete)
{
var omaObject = await channelReader.ReadAsync();
State.Clear();
Console.WriteLine($"State has been cleaned: {State.Count}");
await output.Writer.WriteAsync(true);
}
});
output.Writer.Complete();
return output;
}