当我在表单初始化后运行代码时,它按照我的预期方式工作。但是,当我在form Load
事件中第一次加载它时,它会延迟UI绘制一秒钟。我真的不想制作启动画面,因为已经有一些UI元素表明正在完成工作。
volatile bool ABfired = false;
public form_Main()
{
InitializeComponent();
}
void GetSearchableDataCache()
{
this.UIThread(() =>
{
ultraActivityIndicator1.AnimationEnabled = true;
ultraLabel_Status.Text = "Querying SQL...";
});
var projids = new List<string>();
var names = new List<string>();
ABfired = false;
Thread A = (new Thread(() =>
{
while (!ABfired)
{
}
projids = new sql.ProjectIDs(true).Get();
})
{
Name = "Thread A", IsBackground = true
});
Thread B = (new Thread(() =>
{
while (!ABfired)
{
}
names = new sql.names(true).Get();
})
{
Name = "Thread B", IsBackground = true
});
Thread AB = (new Thread(() =>
{
ABfired = true;
while (A.IsAlive || B.IsAlive)
{
}
this.UIThread(() =>
{
ultraActivityIndicator1.AnimationEnabled = false;
ultraLabel_Status.Text = "Ready";
});
})
{
Name = "Thread AB", IsBackground = true
});
A.Start();
B.Start();
AB.Start();
}
private void form_Main_Load(object sender, EventArgs e)
{
GetSearchableDataCache();
}
答案 0 :(得分:3)
您的线程正在旋转,因此它们都会耗尽整个CPU内核 这会大大减慢系统速度。
你永远不应该像现在这样使用while
循环
相反,请等待ManualResetEvent
。
但是,您可以使用Task
更简单的实现替换所有代码,而不使用显式线程。
使用Task.ContinueWith
将允许您在上一个任务完成后运行任务而不会浪费线程。
答案 1 :(得分:0)
啊 - 学习编程。比“它的作品”多一点。 WHOW - 这已经接近cpu滥用了,因为我见过它。
while(!ABfired)
CRAP,特别是因为ABFired不是锁,没有同步。查找MUTEX,或者ManualResetEvent。你想要一个cpu核心,甚至不确定你有什么memroy障碍,以便线程看到更改的值。
其次,你不能从那些线程回到UI而不会做一些事情 - 调用回主线程。
第三,也许形成LAOD并不是正确的地方?激活表格怎么样?
第四,三个线程只是玩有趣的游戏?不要使用线程启动,使用任务,与contiuation - 你重建那些我20年来看到的最糟糕的形式。 { }