如何解决如何使用线程在XNA中运行数据库查询?
| 我目前正在使用XNA开发一个项目,该项目将从本地SQL数据库中获取有关每个对象(每个对象将显示在屏幕上)的信息(ID,名称,文件位置等)。 我想在一个单独的线程上运行数据库查询,以便在数据库挂起或发生其他意外事件时,呈现的屏幕不会冻结。我正在使用XNA 4.0,该应用程序将仅在Windows上运行。这可能吗?如果可以,怎么办?解决方法
有许多可用的选项。一般来说,您需要查询在单独的线程中运行。您可以使用
线程池
QueueUserWorkItem
任务
后台工作者
异步调用数据库
并行调用
在此处和此处手动创建线程
我将从线程池开始,看看它是如何工作的,专用的手动线程在内存管理和重用方面不那么强大。
, 完全不做。说真的有充分的理由使用线程,但您的理由是虚假的:
如果数据库挂起或发生其他意外事件,渲染的屏幕不会冻结
数据库不挂起,不可预见的事件是不可预见的事件。例如,如何处理数据库3分钟未回答?显示带有未知对象的屏幕?
, 您如何表示“最佳”?有很多使用线程的方法,它们都有优点和缺点。
显式声明一个新线程并启动它可以使您对该线程的执行状态进行最直接的控制:
var myDbThread = new Thread(()=>myDbRepo.GetRecordById<MyEntity>(idString));
myDbThread.Start();
现在,只要您有对myDbThread的引用,就可以中止它,暂停它,加入它等等。您必须管理自己创建的线程。
对于大多数并行任务,建议使用ThreadPool。但是,您失去了一些控制权:
Action myDbLambda = () => myEntityProperty = myDbRepo.GetRecordById<MyEntity>(idString);
var asyncResult = myDbLambda.BeginInvoke();
一旦asyncResult.IsComplete返回true,myEntityProperty将具有该值。您也可以将其构造为Func,并使用回调来设置值(建议这样做)。异步模型内置在BeginInvoke()/ EndInvoke()方法对中,并且ThreadPool可能会遇到许多异常,例如超时,这只会重新启动超时的线程。但是,您不能“放弃”并终止ThreadPool线程,而在ThreadPool线程上“加入”则有些棘手,如果您要启动很多线程,则ThreadPool将启动它们在250ms的间隔内,这可能不是处理器的最佳使用方式。
有很多使用ThreadPool的方法。在委托对v3.5中的.NET编程变得更加重要之前,ThreadPool.QueueUserWorkItem是主要方法。现在,正如我所说,代表具有BeginInvoke和EndInvoke方法,这些方法使您可以使用幕后内置的异步模型启动后台进程。在WinForms / WPF中,您还可以创建事件驱动的BackgroundWorker组件,从而可以在GUI元素中监视进度和完成情况。
要注意的一件事;在ASP.NET中使用后台线程实际上绝不是一个好主意。除非您真的知道自己在做什么,否则在最好的情况下您将无法获得发送到工作线程的行为结果,在最坏的情况下,您可能会使站点尝试崩溃。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。