我正在为电报机器人开发一个控制台应用程序。
我有NextFiledStrig
告诉应用程序应该向用户询问哪个字段。当多个用户与机器人或应用程序进行通信时,NextFiledStrig
会对所有用户进行更改。
是否有类似会话的东西,所以我可以为每个用户存储NextFiledStrig
?或者我必须一遍又一遍地从数据库中获取它的价值?
我在ASP.net C#工作,我是控制台应用程序的新手。
我搜索了很多,但我找不到任何解决问题的方法。许多人得到了回答:它是一个控制台应用程序,只有一个用户,你不需要会话。
答案 0 :(得分:2)
控制台应用程序中没有会话。但您可以使用简单的字典来存储数据:
private static Dictionary<User, NextFiledStrig> s_nextFiledByUser = new Dictionary<User, NextFiledStrig>();
private static GetNextFiledForUser(User user) {
NextFiledStrig value;
bool isCached = s_nextFiledByUser.TryGetValue(user, out value);
if (!isCached) {
value = new NextFiledStrig(); //Replace this with the code that will get the value
nextFiledByUser.Add(user, value);
}
return value;
}
答案 1 :(得分:1)
如果您只需要使用控制台应用程序,请不要考虑。没有类似的东西。您只能使用数据库来存储密钥的值。但请告诉我这个机器人将如何被用户调用?
答案 2 :(得分:0)
我使用AsyncLocal为我的客户端 - 服务器应用程序实现了一个会话系统,我将尝试解释它:
如果异步运行每个客户端连接处理程序:
public class Session
{
private static AsyncLocal<IDictionary<string,object>> _Data = new AsyncLocal<Dictionary<string,object>>();
public static IDictionary Data
{
set
{
_Data.Value = value;
}
get
{
return _Data.Value;
}
}
}
// fire the client manager and go to keep listening for client connections.
Task manager = Task.Run(async () => await Client.Start())
public async Task Start()
{
Session.Data = new Dictionary<string,object>();
// Do your receive, manage the bytes, etc.
}
这样,即使是静态属性,Session.Data在该异步任务和子任务上也是唯一的。
举个例子:
Session.Data = new Dictionary<string,object>() {{"value", 1}}
Console.WriteLine(Session.Data["value"].toString()); // will be 1
Task manager1 = Task.Run(async () =>
{
Console.WriteLine(Session.Data["value"].toString()); // will be 1
Session.Data = new Dictionary<string,object>() {{"value", 2}}
Console.WriteLine(Session.Data["value"].toString()); // will be 2
Task manager2 = Task.Run(async () =>
{
Console.WriteLine(Session.Data["value"].toString()); // will be 2
Session.Data = new Dictionary<string,object>() {{"value", 3}}
Console.WriteLine(Session.Data["value"].toString()); // will be 3
}
Task manager3 = Task.Run(async () =>
{
Console.WriteLine(Session.Data["value"].toString()); // will be 2
Session.Data = new Dictionary<string,object>() {{"value", 4}}
Console.WriteLine(Session.Data["value"].toString()); // will be 4
}
Console.WriteLine(Session.Data["value"].toString()); // will be 2
}
Console.WriteLine(Session.Data["value"].toString()); // will be 1
希望这有助于您或至少指出一个良好的方向。