Skip to main content
 首页 » 编程设计

c#之数据库连接期间的 UI 锁定

2024年01月13日31zhwl

当我尝试连接到一个不存在的实例时,UI 在我的应用程序中锁定 我试过使用新线程,但这似乎不起作用

//从主类调用

 Dispatcher.BeginInvoke(new Action( 
 () => Timedtask(instance, database)));     
 
 //Method 
 
  public void Timedtask(string instance, string database) 
        {  
            Timer.Start(); 
            Timer.Tick += delegate 
            { 
                if (!TimedTask.timer_Tick(instance, database)) 
                { 
                    Dispatcher.CurrentDispatcher.Invoke(Stopped); 
                } 
            }; 
 
        }    
 
    // Try an open connection 
 
         using (var con1 = new SqlConnection 
                { 
                    ConnectionString = @"Data Source=" + instanceName1 + ";Integrated Security=SSPI;" + 
                 "MultipleActiveResultSets=true;" 
                }) 
 
 
                { 
 
                //more code 
                 con1.Open();                
                //more code 
                } 

请您参考如下方法:

Dispatcher.BeginInvoke 将调用放回 UI 线程而不是后台线程。因此,您的所有操作都在 UI 线程上运行。因此锁定了您的 UI。

使用Task 或BackgroundWorker 委托(delegate)对后台线程的调用。请注意,无法从后台线程修改任何 GUI 组件,因此您需要使用 Dispatcher.Invoke 或 Dispatcher.BeginInvoke 将其编码回 UI 线程。


Task.Factory.StartNew(() => { Timedtask(instance, database) }); 

或

如果使用 .Net 3.5,则可以使用 backgroundWorker:

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += (s, e) => { Timedtask(instance, database); }; 
worker.RunWorkerAsync();