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
{
}
}
}