2016-12-24 5 views
0

Я разрабатываю консольное приложение для бота телеграммы.Что-то вроде сеанса для консольного приложения

У меня есть NextFiledStrig, которые сообщают приложению, какое поле следует запрашивать у пользователя. Поскольку несколько пользователей общаются с ботом или приложением, изменение NextFiledStrig для всех.

Есть ли что-то вроде сеанса, поэтому я могу хранить NextFiledStrig в нем для каждого пользователя? Или мне нужно снова и снова получать его ценность из базы данных?

Я работал ASP.net C#, и я новичок в консольном приложении.

Я искал много, но я не мог найти ничего, что могло бы решить мою проблему. Многим людям ответили: это консольное приложение, и для этого есть только один пользователь, и вам не нужен сеанс.

+1

Обычно у BOT-фреймворков есть функции управления сессиями, я думаю. Вы должны смотреть на это скорее на управление сеансом в своем хост-приложении. – Developer

ответ

1

В консольном приложении сеанса нет. Но вы можете использовать простой словарь для хранения ваших данных:

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; 
} 
+0

Я думаю, что база данных - лучшее решение. потому что приложение может сбой или закрытие. –

+2

@MahdiHesari, вы можете сохранить эти значения в файл в своей папке AppData, у него есть лучшая производительность по сравнению с использованием БД. –

+1

@KimHoang, используя базу данных, сделает вашу жизнь намного легче, когда вам придется иметь дело с многопоточным (и я полагаю, что бот Telegram должен будет обрабатывать команды, поступающие из разных потоков). –

1

Если вам нужно использовать только консольное приложение, не думайте. Нет ничего подобного. Вы можете использовать базу данных только для хранения значения для ключа. Но скажите, как этот бот будет вызываться пользователями?

+0

с бот-маркером, который уникален для каждого бота. –

+0

, который может быть из веб-приложения? –

+0

Дополнительная информация [здесь] (https://core.telegram.org/bots/api) –

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 

Надеется, что это помогает или, по крайней мере точкам на правильное направление.