gpt4 book ai didi

使用从后台线程调用的 c# 线程问题

转载 作者:太空狗 更新时间:2023-10-29 22:17:47 25 4
gpt4 key购买 nike

我有线程,它处理一些分析工作。

   private static void ThreadProc(object obj)
{
var grid = (DataGridView)obj;
foreach (DataGridViewRow row in grid.Rows)
{
if (Parser.GetPreparationByClientNameForSynonims(row.Cells["Prep"].Value.ToString()) != null)
UpdateGridSafe(grid,row.Index,1);
Thread.Sleep(10);
}
}

我想在循环中安全地更新我的 gridView,所以我使用经典方式:

    private delegate void UpdateGridDelegate(DataGridView grid, int rowIdx, int type);
public static void UpdateGridSafe(DataGridView grid, int rowIdx, int type)
{
if (grid.InvokeRequired)
{
grid.Invoke(new UpdateGridDelegate(UpdateGridSafe), new object[] { grid, rowIdx, type });
}
else
{
if (type == 1)
grid.Rows[rowIdx].Cells["Prep"].Style.ForeColor = Color.Red;
if (type==2)
grid.Rows[rowIdx].Cells["Prep"].Style.ForeColor = Color.ForestGreen;

}
}

但是当我进入 UpdateGridSafe 时,程序挂起。

在调试器中,我看到 grid.Invoke 没有调用 UpdateGridSafe。请帮忙 - 怎么了?

编辑

经典线程创建代码

        Thread t = new Thread(new ParameterizedThreadStart(ThreadProc));
t.Start(dgvSource);
t.Join();
MessageBox.Show("Done", "Info");

最佳答案

你有一个僵局。在 ThreadProc 完成之前,您的 t.Join 会阻塞 GUI 线程。 ThreadProc 被阻止等待 t.Join 完成,以便它可以执行调用。

错误代码

    Thread t = new Thread(new ParameterizedThreadStart(ThreadProc)); 
t.Start(dgvSource);
t.Join(); <--- DEADLOCK YOUR PROGRAM
MessageBox.Show("Done", "Info");

好的代码

   backgroundWorker1.RunWorkerAsync

private void backgroundWorker1_DoWork(object sender,
DoWorkEventArgs e)
{
var grid = (DataGridView)obj;
foreach (DataGridViewRow row in grid.Rows)
{
if (Parser.GetPreparationByClientNameForSynonims(row.Cells["Prep"].Value.ToString()) != null)
UpdateGridSafe(grid,row.Index,1);
// don't need this Thread.Sleep(10);
}
}

private void backgroundWorker1_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Done", "Info");
}

编辑

也可以使用 BeginInvoke 而不是 Invoke。这样,您的工作线程就不必在每次更新 GUI 时都阻塞。

引用

Avoid Invoke(), prefer BeginInvoke()

关于使用从后台线程调用的 c# 线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2971387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com