线程未按顺序运行

时间:2017-08-31 01:51:24

标签: wpf multithreading task

当我改变方法的顺序时。 例如

我正在使用此代码:

private void RefreshInfo()
    {
        try
        {
            Task.Factory.StartNew(() =>
            {
                DXSplashScreen.Show<SplashScreenView1>();
                LoadGrid();
                Thread.Sleep(5000);
            }).ContinueWith(t => DXSplashScreen.Close(),TaskScheduler.FromCurrentSynchronizationContext());
        }
        catch(Exception ex) {
            MessageBox.Show(ex.Message);
        }

    }

当我运行它时,启动画面快速关闭,不要等待5个secons。

但如果我这样做:

 try
        {
            Task.Factory.StartNew(() =>
            {
                DXSplashScreen.Show<SplashScreenView1>();
                Thread.Sleep(5000);
                LoadGrid();
            }).ContinueWith(t => DXSplashScreen.Close(),TaskScheduler.FromCurrentSynchronizationContext());
        }
        catch(Exception ex) {
            MessageBox.Show(ex.Message);
        }

启动画面等待5秒钟。 为什么? 此致

2 个答案:

答案 0 :(得分:1)

您还没有为任何人提供足够的信息来重现您的问题,但您的代码看起来有点奇怪。

首先,您应该在UI线程上显示并关闭启动画面。

其次,您的try / catch无法捕获任务中发生的任何异常。

试试这个:

private void RefreshInfo()
{
    DXSplashScreen.Show<SplashScreenView1>();
    Task.Factory.StartNew(() =>
    {
        LoadGrid();
        Thread.Sleep(5000);
    }).ContinueWith(t =>
    {
        DXSplashScreen.Close();
        if (t.Exception != null)
            MessageBox.Show(t.Exception.Message);
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

答案 1 :(得分:0)

感谢您的帮助 这对我有用

DXSplashScreen.Show<SplashScreenView1>();
        Task.Factory.StartNew(() =>
        {
            LoadData();               
        }).ContinueWith(t => {
            grdLicenses.ItemsSource = DataToTable();
            DXSplashScreen.Close();
            if (t.Exception !=null)
            {
                MessageBox.Show(t.Exception.Message);
            }},TaskScheduler.FromCurrentSynchronizationContext());

正如你所说的尝试没有得到任何错误,代码中存在错误,因为loadGrid属性修改了主线程中的控件。 我移动了从数据库中获取值的loadData,然后在continue中添加了更新主线程的唯一方法。 此致