C#在单独的线程中连接到数据库我有一个位于任务栏中的应用程序并定期检查数据库(通过SQLConnection)。如果数据库不可访问,它只会在通知图标上显示红色状态,而不会显示其他任何内容。这是因为用户将使用笔记本电脑在设施之间旅行,而数据库只能通过内部网络或通过VPN连接时访问。我遇到的问题是,当数据库无法访问时,我仍然希望通知图标上下文菜单能够响应。目前,如果用户在数据库尝试连接时尝试与菜单交互,则线程会被连接尝试锁定。我想要的是数据库连接发生在一个单独的线程中,但我知道在线程之间共享连接对象是一件坏事。连接数据库后,我需要从原始线程查询它。有什么好办法吗?我知道我可以在新线程中使用rus函数并简单地检查连接是否失败,然后如果它返回成功,则原始线程可以继续并连接它自己的数据库对象。但这种方法似乎是一个糟糕的解决方法。主意?谢谢!感谢您的建议-我从他们那里学到了很多东西。最后,我做了我一开始就该做的事。每当数据库需要定期更新时,主(UI)线程启动一个新线程(包括数据库对象的创建和连接)。因此,就像HenkHolterman在对我的原始消息的评论中建议的那样,我真的不需要创建数据库并在单独的线程中使用它运行操作。一旦升级到VS2010,我肯定会对使用SqlConnection.OpenAsync感兴趣。再次感谢。SqlConnection没有线程亲和性要求,因此您可以在单独的线程上创建和打开它,并将引用传递回UI线程。只要您不从多个线程同时调用同一实例上的任何属性或方法,就不会有任何问题。使用Task类(System.Threading.Task)在后台启动此操作,然后调用ContinueWith将实例的所有权转移回UI线程。publicclassTrayIconForm:Form{privateSqlConnectionconnection=null;privatevoidForm_Load(objectsender,EventArgsargs){TaskSchedulerui=TaskScheduler.FromCurrentSynchronizationContext();Task.Factory.StartNew(()=>{varsqlConnection=newSql;sql.ConnectionString="你的连接字符串";sql.Open();returnsql;}).ContinueWith((task=>{connection=task.Result;//您可以根据需要在这里访问其他UI元素。}),ui);您可以使用新的async和await关键字来执行此操作,这些关键字将在C#5.0中引入并且现在可通过AsyncCTP使用。privateasyncvoidForm_Load(objectsender,EventArgsargs){connection=awaitTask.Run(()=>//TaskEx.RunintheCTP{varsql=newSqlConnection();sql.ConnectionString="yourconnectionstring";sql.Open();返回sql;});我推荐使用新的C#AsyncCTP。这将允许您保留UI线程,从而降低复杂性。使用BackgroundWorker对象的SqlConnection.OpenAsync应该可以轻松解决您的问题,但更准确地说,您想使用一个线程来尝试打开连接,让UI线程准备好接收用户输入。以上就是C#学习教程:C#单独线程连接数据库,分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
