C# Windows Phone 7/8中的多线程和本地数据库访问

C# Windows Phone 7/8中的多线程和本地数据库访问,c#,database,multithreading,windows-phone-7,windows-phone-8,C#,Database,Multithreading,Windows Phone 7,Windows Phone 8,我有一个本地数据库 我有一个简单的类,用于处理本地数据库 public class DataBase { public void Select() { try { //something select from the DB } finally { } } public void Insert() { try

我有一个本地数据库

我有一个简单的类,用于处理本地数据库

public class DataBase
{

    public void Select()
    {
        try
        {
            //something select from the DB
        }
        finally
        {

        }
    }

    public void Insert()
    {
        try
        {
            //something insert to the DB
        }
        finally
        {

        }
    }

    public void Update()
    {
        try
        {
            //something update in the DB
        }
        finally
        {

        }
    }


    public void Remove()
    {
        try
        {
            //something remove from the DB
        }
        finally
        {

        }
    }
}
A可以从不同的线程对本地数据库进行许多查询。但我只通过类数据库处理本地数据库。我希望避免所选数据被删除或更新等情况。 因此,我想锁定数据库,使其一次只对一个线程可用。但我不希望它成为应用程序在性能方面的弱点。 如何最好地继续?什么最适合Windows Phone 7/8中的本地数据库

更新

我发现了关于并发数据库访问的问题。也许我错了,但我想这正是我需要的

我重写了代码,现在我有了这样的东西

public class CacheDataContext : DataContext
    {    
      public static string DBConnectionString = "Data Source=isostore:/Cache.sdf";

      public CacheDataContext(string connectionString) : base(connectionString) { }

      public static AutoResetEvent OperationOnDatabaseUsers = new AutoResetEvent(true);

      public static AutoResetEvent OperationOnDatabaseCities = new AutoResetEvent(true);

     public static AutoResetEvent OperationOnDatabaseVenues = new AutoResetEvent(true);


     public Table<Users> UsersItems;

     public Table<Cities> CitiesItems;

     public Table<Venues> VenuesItems;    

    }

我没有使用过数据库。也许您应该使用DispatcherInvoke方法来处理您的DB和UI,因为当您使用线程和UI时,有必要使用Dispatcher

说到数据库的写入和读取-可以同时进行,但是如果某些数据仍在写入,而您正在进行读取-在写入完成之前,数据不会显示

“一次只对一个线程可用”

尝试使用锁并等待。但你正在尝试做的是开发多线程程序,它的运行速度不会比一个线程快=/

如果您正在引用,那么它不是线程安全的,是的,您需要添加锁以使其保持一致。InvalidOperationException可以通过使用UI线程(Deployment.Current.Dispatcher.BeginInvoke(()=>{…}))来解决,正如Cheese所指出的那样,只针对db.SubmitChanges()方法


另一个更通用的DB解决方案是。不幸的是,我还没有用多线程Windows Phone应用程序对其进行测试,因此我无法确定它是否适合您,即使它应该是线程安全数据库。

您使用的哪个数据库不能自动处理这些情况…我经常有InvalidOperationException,调用SubmitChanges()时发生异常。你确定这种情况是自动处理的吗?谢谢你的回复!当然,我只通过Dispatcher使用UI。但我不太明白它与从数据库读取的记录有什么关系。在任何情况下,如果我做错了什么,你会得到异常无效的跨线程访问,不是吗?我更新我的帖子。你觉得这个怎么样?谢谢!SQLite这就是我将来要检查的内容。:)
public class DataBase
{

    public void Select()
    {
        try
        {
            //something select from the DB
        }
        finally
        {

        }
    }

    public void Insert()
    {
        try
        {
            //something insert to the DB
        }
        finally
        {

        }
    }

    public void Update()
    {
        try
        {
            //something update in the DB
        }
        finally
        {

        }
    }


    public void Remove()
    {
        try
        {
            //something remove from the DB
        }
        finally
        {

        }
    }
}