像控制台应用程序的会话

时间:2016-12-24 08:02:56

标签: c# console-application telegram-bot

我正在为电报机器人开发一个控制台应用程序。

我有NextFiledStrig告诉应用程序应该向用户询问哪个字段。当多个用户与机器人或应用程序进行通信时,NextFiledStrig会对所有用户进行更改。

是否有类似会话的东西,所以我可以为每个用户存储NextFiledStrig?或者我必须一遍又一遍地从数据库中获取它的价值?

我在ASP.net C#工作,我是控制台应用程序的新手。

我搜索了很多,但我找不到任何解决问题的方法。许多人得到了回答:它是一个控制台应用程序,只有一个用户,你不需要会话。

3 个答案:

答案 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为我的客户端 - 服务器应用程序实现了一个会话系统,我将尝试解释它:

如果异步运行每个客户端连接处理程序:

  • 使用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

希望这有助于您或至少指出一个良好的方向。