c# - 如何为每个新线程创建新的类对象?
问题描述
我有一个用 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不注意代码,我只是尝试重现逻辑。
解决方案
当你这样做时,你正在创建一个闭包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
}
推荐阅读
- jmeter - 如何使用 Taurus 修改 jmeter 脚本
- c++ - 如何在解析过程中区分 IP 地址和域名
- php - Laravel:动态获取查询中使用的订单?
- dictionary - Umbraco 字典翻译在本地主机上无法正常工作
- google-cloud-platform - 为 Restful API 配置 Pub/Sub
- tycho - 平台运行时和依赖项
- angular - ng serve localhost:4200 打开时会下载一个空文件
- python - 需要帮助优化 gspread API 调用
- wpf - 为什么使用 ToolWindow 时只有顶部边框可见?
- c# - Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y") 总是返回 0