1

我有一个使用 MVC3 (Razor) 在 VS2010 中构建的网站

我使用 DBContexts 访问数据库,我的连接字符串是:

<add name="SystemDBContext"
connectionString="Data Source=|DataDirectory|System.sdf"
providerName="System.Data.SqlServerCe.4.0" />

我想要一个游戏循环,所以我在 Application_Start 中启动了一个新线程,它使用 DBContext 循环和访问数据库。

似乎正在发生的事情是循环使用 DBContext 并锁定 db 文件,然后每当您尝试从网站本身的 DBContext 进行更改时,该文件正在使用中。

这不是在我声明 DBContext 时,而是在我尝试使用 DBContext 执行某种搜索或更新时发生。

这是我的 Global.asax

    protected void Application_Start()
    {
        ...
        Manager m = new Manager();
        Thread t = new Thread(m.Start);
        t.Start();
    }

我的一个控制器的一部分:

public class myController : Controller
{
    private SystemDBContext db = new SystemDBContext();


    public ViewResult Index()
    {
        var engines = db.Engines.Include(e => e.state);
        return View(engines.ToList());
    }
    ...

我的循环看起来像这样:

public class Manager
{
    public void Start()
    {
        while (true)
        {
            SystemDBContext db = new SystemDBContext();
            var query = from ...
        }
        ...

这样做的最佳做法是什么?我一直在考虑 Singletons、Locks 或 Synclocks,调整连接字符串以允许对数据库文件进行多个附加,或者让我的循环请求执行更新的网页。

有任何想法吗?

4

1 回答 1

4

似乎正在发生的事情是循环使用 DBContext 并锁定 db 文件,然后每当您尝试从网站本身的 DBContext 进行更改时,该文件正在使用中。

回到阅读文档?它说 WinCE 不是多线程服务器的部分。改用 SQL Server - Express 是免费的。CE 用于有限的可扩展性项目,单线程访问。

这样做的最佳做法是什么?

使用合适的数据库服务器。CE 有很大的问题,特别是如果您一直启动/停止数据库引擎,这会导致很多低效的磁盘访问。

SQL Server 正是为此而做的,正如我所说 - Express 很便宜。

于 2012-06-05T18:16:41.247 回答