【发布时间】:2023-04-10 00:55:02
【问题描述】:
我有一个最近制作的多线程控制台应用程序。我希望我可以在新的控制台窗口中打开线程,但根据this article,这样做是不可能/不建议的。
我有以下几点:
do
{
selection = DisplayMenu();
switch (selection)
{
case 1:
Thread thread1 = new Thread(() => Method1(param1, param2, param3));
thread1.Start();
break;
case 2:
Thread thread2 = new Thread(() => Method2(param1, param2, param3));
thread2.Start();
break;
default:
break;
}
} while (selection != 3);
Method1 和 Method2 都有 Console.WriteLine() 调用,向控制台窗口显示消息,向用户指示已完成的步骤、当前正在运行的步骤等。一切正常,除了当 @987654326 @ 在第一个线程运行后显示,它有点被推到顶部,因为 Console 记录 switch 语句中的方法所做的,因此我最初想将线程卸载到另一个控制台窗口.有什么建议吗?
更新
这就是DisplayMenu() 所做的:
public static int DisplayMenu()
{
int selection = 0;
Console.WriteLine("What do you want to do?");
Console.WriteLine("[1] X");
Console.WriteLine("[2] Y");
Console.WriteLine("[3] QUIT");
Console.Write("Selection: ");
selection = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
return selection ;
}
更新
根据接受的答案,我现在正尝试将我的 Console.WriteLine() 调用路由到 Windows 窗体。我已将所有需要的依赖项和一个 Windows 窗体添加到我的控制台项目中。这是我目前所拥有的。
public static void WorkToDo()
{
MyCustomObj myObj = new MyCustomObject();
var form = new OutputForm();
TextBox tb = new TextBox();
form.Controls.Add(tb);
form.Show(); //Code does not progress until window is closed
if (MyCustomObject.Validate())
{
tb.Text += "Sent from Console App!"; //This was previously my Console.WriteLine() call.
似乎我无法流式传输到TextBox,因为该进程现在正在运行表单,而不是控制台应用程序中的其余代码。
【问题讨论】:
-
什么是
DisplayMenu? -
@EZI 请查看更新。
-
如果你需要这么复杂的控制台系统,你可能想看看将光标设置到窗口底部并在那里输出状态数据,然后将光标重置回窗口的主要部分对于其他一切。锁定同步对象以保持一次只有一个进程写入窗口。如果需要,有一些方法可以打开更多控制台窗口。
标签: c# multithreading user-interface logging console-application