当我在初始化表单后运行代码时,它按我预期的方式工作。但是,当我在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();
}
你的线程是旋转,所以他们每个使用整个CPU核心。
这会大大降低系统运行速度。
你不应该像现在这样使用while
循环等待。
ManualResetEvent
。然而,你可以用一个更简单的实现来替换所有的代码,使用Task
s,没有显式的线程。
使用Task.ContinueWith
将允许您在前一个任务完成后运行一个任务,而不会浪费一个线程。
学习编程。比"有用"多一点。这是接近cpu滥用,因为我从来没有见过它的到来。
while (!ABfired)
废话,特别是ABFired不是锁,不是同步的。查找MUTEX做什么,或者ManualResetEvent。你正在循环一个cpu核心,甚至没有确保你有内存屏障,以便线程看到改变的值。
第二,你不能从这些线程返回到UI,而不实际地做一些事情,比如——调用回主线程。
第三,也许形式LAOD不是那么正确的地方?激活表单呢?
第四,三个线程哪个只是玩有趣的游戏?不要用线程来启动,用任务来继续——你重建的东西是我20年来见过的最糟糕的形式。{}