首页 > 解决方案 > 如何为每个新线程创建新的类对象?

问题描述

我有一个用 C# 编写的程序,用于分析来自外部 API 的文本数据。主要部分看起来像

主文件

void main {
 var data = new HttpRequest();
 while (true) {
  string response = data.Get("https://api.com/method/").ToString();
  JObject json = JObject.Parse(response);
  if (Convert.ToString(json["updates"][i]["type"]) == "message_new") {
   Data new_data = new Data();
   new_data.Text = json["updates"][i]["text"].ToString();
   .... //filling class new_data//....
   Thread thread = new Thread(() => ProcessMsg(new_data));
   thread.Start();

  } else { //nothing}
  }

 }

数据类

 public class Data
    {

        public string Token = "alof23321cdfds34rf32rty5";
        public string Token_Usr = "fsdfdsf3432";
        public static string GroupId = "3331122";
        public int Time { get; set; }
        public int IdUser { get; set; }
        public int IdConf { get; set; }
        public int IdMessage { get; set; }
        public string Text { get; set; }
    }

但是很多时候(当 2 条消息同时到达时)信息在这些线程中混合在一起(竞争条件?)如何使线程中传递的类只能从此线程访问?也许我应该为此使用其他东西?

ps不注意代码,我只是尝试重现逻辑。

标签: c#multithreadingthread-safety

解决方案


当你这样做时,你正在创建一个闭包Thread thread = new Thread(() => ProcessMsg(new_data));。如果在执行委托之前发生了某些变化new_data,它将在运行时“看到”新版本,即您所经历的。

Thread有两个构造函数,一个接受一个ThreadStart委托,另一个接受一个ParameterizedThreadStart委托和一个对象,在这种情况下,您想使用后者将参数传递给您的线程函数,如下所示:

//...
Thread thread = new Thread(ProcessMsg, new_data);


//..
public void ProcessMsg(object State)
{
    var data = (Data)State;
    //Process the data
}

推荐阅读