gpt4 book ai didi

c# - Windows 窗体、循环和线程

转载 作者:太空宇宙 更新时间:2023-11-03 20:26:11 24 4
gpt4 key购买 nike

我想制作服务器应用程序。一开始它应该创建线程来组织每个连接并在列表框中写入日志。我有问题,因为我不知道在哪里可以创建可以访问 Form1.Listbox1 的新线程。这是我试过的:

public class ServerLoop
{
Form1 form1;
public ServerLoop(Form1 f)
{
form1 = f;
}
public void loop()
{
form1.addConsoleMessage("test");
}
}

和 Form1 类:

public partial class Form1 : Form
{
public Thread tServerLoop;
public ServerLoop serverLoop;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
console.Items.Clear();
players.Items.Clear();
players.Items.Add("Witaj w serwerze");
addConsoleMessage("test");
serverLoop = new ServerLoop(this);
tServerLoop = new Thread(serverLoop.loop);
tServerLoop.Start();
}

private void connectButton_Click(object sender, EventArgs e)
{

}

public void addConsoleMessage(String msg)
{
console.Items.Add(msg);
}
}

有人知道我该怎么做才能实现这一目标吗?

最佳答案

好吧,你可以使用 Invoke将委托(delegate)编码回 UI 线程,其中 ListBox可以安全访问。

public void loop() 
{
form1.Invoke(new Action(
() =>
{
form1.addConsoleMessage("test");
}));
}

但是,唉,这个选项是次等的。实际上,这些编码技术通常很糟糕。别弄错我的意思。有时间地点Invoke (等等),但与许多情况一样,这不是其中之一。

  • 代码丑是因为要撒Invoke到处打电话。
  • 它迫使您采用 UI 线程和工作线程紧密耦合的设计。
  • 工作线程决定 UI 的更新频率。
  • 效率低下。
  • 它可以淹没 UI 消息队列(至少可以使用 BeginInvoke )。
  • 工作线程必须等待 UI 线程的响应才能继续(无论如何它将返回 Invoke)。

那么我该如何解决这个问题呢?好吧,和无聊的老System.Windows.Forms.Timer和花哨的新ConcurrentQueue<T>当然。

public partial class Form1 : Form                    
{
private ConcurrentQueue<string> queue = new ConcurrentQueue<string>();

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
console.Items.Clear();
console.Items.Add("test");
players.Items.Clear();
players.Items.Add("Witaj w serwerze");
Task.Factory.StartNew(
() =>
{
while (GetSomeCondition())
{
string value = GetSomeValue();
queue.Enqueue(value);
}
});
}

private void YourTimer_Tick(object sender, EventArgs e)
{
string value;
while (queue.TryDequeue(out value)
{
console.Items.Add(value);
}
}
}

那么我们现在有什么。

  • 看起来很优雅。
  • 我们的后台任务只知道队列。紧密耦合已被打破。
  • UI 线程现在决定更新频率……这是应该的方式。
  • 效率更高。
  • UI 消息队列不可能被淹没。
  • 最后,工作人员可以完全不知道 UI 线程在做什么而快活地工作。

不过,此解决方案并非完全没有缺点。现在我们的工作线程正在加速,它可能会为队列生成比 UI 线程可以消耗的更多的项目。这通常不是问题,但有一些技术可以解决这个问题。

关于c# - Windows 窗体、循环和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10543422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com