如何在不暂停或中断程序的情况下多线程读取c#中的readline?

时间:2013-04-04 02:02:24

标签: c# multithreading console-application readline steambot

我有一个循环的程序, 并希望在不破坏或暂停程序的情况下允许实时人工交互。

我希望能够将输入用作已经运行的程序的命令。

基本上,如果我没有正确解释它:

- 主程序在前台运行。

-secondary无限循环寻找输入在后台运行

-upon输入并点击返回键(ReadLine),保存字符串并发送到另一个函数(例如Interpreter())

- 我已经设置了所有内容来读取返回的输入(一个简单的循环),我只是无法理解如何在任何时候允许用户输入。

编辑: 我知道堆栈溢出通常是为了帮助解决代码中的错误,但我知道它应该很简单,我只是不明白从哪里开始。

编辑2:

using System;
using System.Threading;
using SteamKit2;
using SteamTrade;
using System.Collections.Generic;
using System.Text;

namespace SteamBot
{
public class Program
{
    public static void Main(string[] EventArgs)
    {
        LicenseGlobal.Seal.Initialize("MY LICENSE KEY *please ignore this*");

        if (System.IO.File.Exists("settings.json"))
        {

            Configuration config = Configuration.LoadConfiguration("settings.json");
            Log mainLog = new Log(config.MainLog, null);
            foreach (Configuration.BotInfo info in config.Bots)
            {
                mainLog.Info("Launching Bot " + info.DisplayName + "...");
                new Thread(() =>
                {


                    int crashes = 0;
                    while (crashes < 1000)
                    {
                        try
                        {
                            new Bot(info, config.ApiKey, (Bot bot, SteamID sid) =>
                            {

                                return (SteamBot.UserHandler)System.Activator.CreateInstance(Type.GetType(bot.BotControlClass), new object[] {
                                        bot,
                                        sid
                                    });
                            }, false);

                        }
                        catch (Exception e)
                        {
                            mainLog.Error("Error With Bot: " + e);
                            crashes++;
                        }
                    }
                }).Start();
                Thread.Sleep(5000);
            }
        }
        else
        {
            Console.WriteLine("Configuration File Does not exist. Please rename 'settings-template.json' to 'settings.json' and modify the settings to match your environment");
        }
        Console.WriteLine("Hello World");
        Console.ReadKey();
    }
}
}

1 个答案:

答案 0 :(得分:3)

您的主线程应该是等待用户输入的线程。 像这样:

using System;
using System.Threading;

namespace Input
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            // This is to stop the worker thread
            var workerShouldStop = false;

            var worker = new Thread(() => 
            {
                // do work
                while (!workerShouldStop) {
                    Thread.Sleep(1000);
                    Console.WriteLine("doing things ...");
                };
            });

            worker.Start();

            string input;
            do 
            {
                Console.Write ("Your input (enter to quit):");
                input = Console.ReadLine();
                Console.WriteLine("input is:" + input);
            } while(!String.IsNullOrWhiteSpace(input));

            // Stop the worker thread
            workerShouldStop = true;
        }
    }
}