Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 可以在等待的线程上调用吗?_.net_Multithreading - Fatal编程技术网

.net 可以在等待的线程上调用吗?

.net 可以在等待的线程上调用吗?,.net,multithreading,.net,Multithreading,在这种情况下,我希望让主线程等待,而其他线程可以在主线程上调用,而无需调用Application.Run 下面的代码显示了我试图实现的功能,除了主线程和数据加载线程导致死锁之外 static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Mai

在这种情况下,我希望让主线程等待,而其他线程可以在主线程上调用,而无需调用Application.Run

下面的代码显示了我试图实现的功能,除了主线程和数据加载线程导致死锁之外

    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”,这正是我想要解决上述问题的原因。希望它能使我的代码更具可读性,而不是所有这些回调。对异步代码的语言支持将是一个受欢迎的补充。