.net 可以在等待的线程上调用吗?
在这种情况下,我希望让主线程等待,而其他线程可以在主线程上调用,而无需调用Application.Run 下面的代码显示了我试图实现的功能,除了主线程和数据加载线程导致死锁之外.net 可以在等待的线程上调用吗?,.net,multithreading,.net,Multithreading,在这种情况下,我希望让主线程等待,而其他线程可以在主线程上调用,而无需调用Application.Run 下面的代码显示了我试图实现的功能,除了主线程和数据加载线程导致死锁之外 static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Mai
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form1 = new Form1();
form1.Show();
Thread loadDataThread = new Thread(() =>
{
//Load Data that takes a long time
string title = LoadData();
form1.Invoke((Action)delegate { form1.Text = title; });
});
loadDataThread.Name = "Data Loading Thread";
loadDataThread.Start();
//wait for loading to be completed (deadlock)
loadDataThread.Join();
//Do more stuffs
Application.Run();
}
private static string LoadData()
{
Thread.Sleep(1000);
return "Hello Thread";
}
}
静态类程序
{
///
///应用程序的主要入口点。
///
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form1=新form1();
表1.Show();
线程loadDataThread=新线程(()=>
{
//加载需要很长时间的数据
字符串title=LoadData();
form1.Invoke((操作)委托{form1.Text=title;});
});
loadDataThread.Name=“数据加载线程”;
loadDataThread.Start();
//等待加载完成(死锁)
loadDataThread.Join();
//多做事
Application.Run();
}
私有静态字符串LoadData()
{
睡眠(1000);
返回“Hello线程”;
}
}
谢谢否。您需要调用
应用程序。运行
,然后在UI线程上安排代理
另外,最好使用
任务
类而不是控件。调用
调用只起作用,因为在Windows窗体应用程序中,有一个消息循环在应用程序的整个生命周期内运行。如果您在Thread.Join上被阻止,则消息循环不会处理消息,这也意味着它不会处理您的调用
在.NET framework中有一些阻塞调用确实会传递消息,但您不能(也不应该)依赖于这些,因为它们通常会在您的应用程序中创建重入性错误,这是一个需要解决的巨大难题
不要在等待加载数据时阻塞UI线程,而应该让它在后台运行,并显示初始屏幕。最后,您可以使用BeginInvoke关闭启动屏幕,打开主屏幕或加载结束时需要执行的任何操作。类似于
static void Main() {
Application.EnableVisualStyles();
var splashScreen = new Form1();
var mainScreen = new Form2();
splashScreen.Show();
ThreadPool.QueueUserWorkItem(delegate {
LoadLotsOfData();
splashScreen.BeginInvoke(delegate {
splashScreen.Close();
mainScreen.Show();
});
}
Application.Run();
}
我不知道有任务课。我倾向于使用线程、线程池或调用。谢谢你的信息。我希望Main()代码的执行“看起来”是线性运行的,这样在进行代码检查时更容易遵循。这将隐藏应用程序初始化时的一些复杂情况。感谢您提供的示例。我很好奇其他人是如何处理闪屏问题的。我猜最终最好尽快释放主(UI)线程,以便其他线程可以通过invoke()与UI交互。没问题。如果这回答了您的问题,您应该通过单击复选标记将其标记为已回答。仅供参考:C#5.0 CTP将具有新的语法调用“async”和“await”,这正是我想要解决上述问题的原因。希望它能使我的代码更具可读性,而不是所有这些回调。对异步代码的语言支持将是一个受欢迎的补充。