none
如何在不挂起UI的情况下等待线程执行完成并返回执行结果 RRS feed

  • 问题

  • 我的场景是这样的, 在界面上有一个打开数据库的按钮,当我按下时,连接数据库,并打开连接,如果连接的数据地址错误,这时是打不开的数据库的,那么会有一个长时间,15秒的等待过程。所以我在想是否可以把判断数据库连接是否可以打开的过程放到一个函数中,然后使用Task进行线程调用,并等待返回结果?

    当然,Task不使用事件委托或回调的方式,因为我需要判断是否可以推开的函数是同步执行的。

    如以下:

            internal static IDbConnection GetConnection(IDbServerInfo dbServerInfo)
            {
                var connectionString = GetSqlConnectionString(dbServerInfo);
                if (string.IsNullOrWhiteSpace(connectionString))
                    throw new Exception("Can't find the connection string at  : ConnectionStrings .");

                var conn = new SqlConnection(connectionString);
                return FlexDbConnection.IsCanBeConnectTo(dbServerInfo.Ip, dbServerInfo.Port) ? conn : null;  -->这里会挂起UI线程,如果避免?
            }

    2020年4月15日 1:08

全部回复

  • Hi jinli,

    根据你的描述,你想要做到不挂起UI线程并且单独处理连接数据库问题。

    我写了一个简单的代码,使用task进行线程的运行。

      private void button1_Click(object sender, EventArgs e)
            {
                string connectionstring = "";
                SqlConnection connection = new SqlConnection(connectionstring);
                Task.Run(() => IsCorrectDB(connection));
                
                
            }
    
            public Task<bool> IsCorrectDB(SqlConnection connection)
            {
                try
                {
                    connection.Open();
                    MessageBox.Show("success connected");
                    return Task.FromResult(true);
                }
                catch(Exception ex)
                {
    
                    Thread.Sleep(3000);
                    MessageBox.Show("failed connect");
                    return Task.FromException<bool>(ex);
                     
                }
            }

    结果:

    结果显示在等待的过程中并不影响文本框的输入。

    希望这会帮到你。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年4月17日 8:13
    版主
  • 你这种这作法,

     Task.Run(() => IsCorrectDB(connection)); 

    是后台运行测试,这个结果的返回是一个线程结果,这个结果在调用的主线程中并没有等待返回,而是直接就过了。所以这段代码没用。

    你要理解下我表达的意思,按下按钮,<同步>判断数据库连接,若无法连接,则快速返回不能连接的结果,而不需要等15秒的超时。这些是同步的。

    2020年4月17日 12:10
  • 你是想要同步还是异步?

    确定好效果就可以

    如果是同步使用TASK+task.wait就行

    如果时异步使用Task

    异步

    同步


    • 已编辑 ARM830 2020年4月17日 14:13
    2020年4月17日 14:11