簡體   English   中英

C#中怪異的多線程行為

[英]Weird multithreading behavior in C#

我有一個偵聽器線程函數,該函數等待傳入連接並為每個客戶端啟動一個新線程。 此外,每次啟動新線程時,它都會寫入“ 1”進行記錄:

void ListenWorkerDoWork(object sender, DoWorkEventArgs e) {
    try {
        var tcpListener = new TcpListener(IPAddress.Any, 843);
        tcpListener.Start();
        var worker = sender as BackgroundWorker;

        if (worker != null) {
            while (!worker.CancellationPending) {
                var client = tcpListener.AcceptTcpClient();
                var clientThread = new Thread(HandleClientComm) { IsBackground = true };
                clientThread.Start(client);
                Logger.Instance.WriteToLog(Logger.Type.Info, "1");
            }
        }
    } catch (Exception ex) {
        Logger.Instance.WriteToLog(Logger.Type.Error, string.Format("An error has occured while listening on port 843:{0}{1}", Environment.NewLine, ex));
    }
}

和客戶端處理線程,該線程將“ 2”寫入日志文件並處理傳入的連接:

private void HandleClientComm(object client) {
    Logger.Instance.WriteToLog(Logger.Type.Info, "2");
    [...]
}

我還有一個小應用程序,它每隔50毫秒連接到服務器並發送/接收一些數據。 如果我僅啟動一個客戶端,則“ 1”和“ 2”的數量相等,但是如果我在不同計算機上啟動多個客戶端實例,則“ 2”的數量比“ 1”高5%。 這意味着我的客戶端線程的過程被調用的次數比實際請求多5%。 怎么可能呢? 例如我有3個客戶。 每個客戶端與服務器執行1000個會話。 結果,我有:

  • 客戶端成功會話3000次
  • 3119偵聽套接字接受的連接數(並寫入“ 1”)
  • 3273次客戶端線程函數被調用

謝謝!

更新:

日志寫入功能是線程安全的:

    public void WriteToLog(Type type, object message) {
        lock(writelock) {
            String str = typeText[(int)type] + DateTime.Now.ToString() + " : " + message.ToString();
            Console.WriteLine(str);
            if (stream != null) {
                stream.WriteLine(str);
                stream.Flush();
            }
        }
    }

重新啟動Visual Studio並重建項目后,該問題已自行解決。 我不知道該說些什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM