C# DataGridView按线程刷新数据
我正在做一个项目,在DataGridView中显示从API收到的信息。我创建了一个线程来更新DataGridView,该线程在并行进程中每5秒运行一次DataGridView刷新方法。但是当程序运行时,在线程的一个步骤之后,信息被放置在DataGridView中,我在线程调用“RefreshGridData”函数的第二个步骤中得到了这个错误: 异常{“对象引用未设置为对象的实例。”}System.NullReferenceException 以下是该线程调用的线程和DataGridView刷新函数的代码: 数据刷新线程C# DataGridView按线程刷新数据,c#,multithreading,winforms,api,datagridview,C#,Multithreading,Winforms,Api,Datagridview,我正在做一个项目,在DataGridView中显示从API收到的信息。我创建了一个线程来更新DataGridView,该线程在并行进程中每5秒运行一次DataGridView刷新方法。但是当程序运行时,在线程的一个步骤之后,信息被放置在DataGridView中,我在线程调用“RefreshGridData”函数的第二个步骤中得到了这个错误: 异常{“对象引用未设置为对象的实例。”}System.NullReferenceException 以下是该线程调用的线程和DataGridView刷新函
{
trdRefresh = new Thread(() =>
{
while (true)
{
try
{
RefreshGridData();
Thread.Sleep(1000 * 5);
}
catch (Exception ex)
{
Thread.Sleep(1000 * 5);
}
}
});
trdRefresh.Start();
}
刷新网格数据:
var response = DataReceiver();
var data = JsonConvert.DeserializeObject<List<ClientPulsLog>>(response);
var source = new BindingSource
{
DataSource = Data
};
DataGridView1.DataSource = source; //The error occurs here
DataGridView1.Refresh();
public static string DataReceiver()
{
try
{
using (var client = new HttpClient())
{
var url = $"http://{"127.0.0.1:9094"}/DataProvider/TotalData/";
var request = "{\"MessageType\":"+ typeId + "}";
var content = client.GetAsync(url).GetAwaiter().GetResult().Content.ReadAsStringAsync().GetAwaiter().GetResult();
return content;
}
}
catch
{
}
return string.Empty;
}
重要提示有趣的是,当我把一个观察点放在错误行的开头时,每当它到达并在调试过程中暂停时,如果我等待一秒钟,然后单击“继续”按钮,程序将毫无问题地继续 我怎样才能解决这个问题
谢谢。欢迎来到StackOverflow。请突出显示NRE的确切抛出位置。还请包括
数据接收器的代码。一个json示例也会很有用。所以,总而言之,请尝试提供一个。你不能从后台线程做任何与UI相关的事情。所以至少是DataGridView1.DataSource=source;DataGridView1.Refresh()代码>必须在UI线程上。@PeterCsala谢谢。我添加了DataReceiver的code@KlausG但我没明白。如何定义UI线程?您使用的是Winforms还是WPF?对于Winforms,您可以使用DataGridView1.Invoke(…)
在UI线程上执行代码。对于WPF,它是DataGridView1.Dispatcher.Invoke(…)