現在、マルチスレッド状態の同期を管理するために、Channels コンストラクト (go ルーチンなど) を使用しています。
そのチャネルを使用して状態管理のさまざまな操作を処理する方法のベスト プラクティスについて知りたいです。1 つの操作は取得であり、別の操作はディスクからその状態を再ロードすることです。
単一のチャネルを使用して複数の操作をサポートし、それらの操作のパラメーターをサポートすることに、かなりの摩擦と複雑さを感じています。具体的には、さまざまな戻り値の型と、そのチャネル内の各操作決定パス内でのキャストをサポートします。
誰かがいくつかの代替方法を推奨できますか、それともこの概念で十分ですか?
次に例を示します。
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;
}