【问题标题】:Ending Thread which wait for click等待点击的结束线程
【发布时间】:2012-04-07 00:20:07
【问题描述】:

我有一个带有 while(true) 的线程来维持我与客户端的连接。在里面我有 if 和 bool。当我单击按钮时,它设置为“true”并开始文件传输(所有指令都在 if)。

我的问题是,我如何在没有 while 的情况下保持线程中的连接,或者当我的客户端断开连接时我应该如何退出那个“while”。

public void SayHi()
        {
            try
            {
                while (true)//for maintain connection
                {

                    if(form1.transfer)
                    {
                        NetworkStream networkStream = clientSocket.GetStream();


                        CardNumber++;
                        form1.SendQuestion(clientSocket, CardNumber, Convert.ToInt32(clNo));

                        form1.transfer = false;
                        Thread AnswerThread = new Thread(WaitForAnswer);
                        AnswerThread.IsBackground = true;
                        AnswerThread.Start();
                    }
                }

            }

【问题讨论】:

  • 我认为您的 while 实际上并没有为维护连接做任何事情。
  • 'while' 推送线程等待按钮点击
  • 好的,但这并不意味着它会保持连接。您也可以对事件中的按钮单击做出反应。

标签: c# .net multithreading


【解决方案1】:

使用 ManualResetEvent 来同步线程。在后台线程中使用 Wait 并在按钮单击答案中使用 Set() 方法

【讨论】:

    【解决方案2】:

    使用 while 不是一个好主意,因为 CPU 周期被浪费在循环中。

    如果 SayHi() 方法不在单独的线程中,您可以安全地移除 while 循环并直接从按钮单击事件内部调用 SayHi() 方法。

    如果 SayHi() 方法在单独的线程中,您可以使用 ManualResetEvent 或 AutoResetEvent 并使用 WaitHandle 在 while 循环内等待。这样可以确保线程不执行任何任务时不会浪费 CPU 周期。

    WaitHandle 的用法示例见以下链接: What is the basic concept behind WaitHandle?

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2021-11-03
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多