C# DataGridView按线程刷新数据

C# DataGridView按线程刷新数据,c#,multithreading,winforms,api,datagridview,C#,Multithreading,Winforms,Api,Datagridview,我正在做一个项目,在DataGridView中显示从API收到的信息。我创建了一个线程来更新DataGridView,该线程在并行进程中每5秒运行一次DataGridView刷新方法。但是当程序运行时,在线程的一个步骤之后,信息被放置在DataGridView中,我在线程调用“RefreshGridData”函数的第二个步骤中得到了这个错误: 异常{“对象引用未设置为对象的实例。”}System.NullReferenceException 以下是该线程调用的线程和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(…)