gpt4 book ai didi

iphone - Monotouch 数据同步 - 为什么我的代码有时会导致 sqlite 错误?

转载 作者:行者123 更新时间:2023-12-03 19:46:42 26 4
gpt4 key购买 nike

我有以下调用(实际上比这更多 - 这是这里有问题的整体方法):

ThreadPool.QueueUserWorkItem(Database.Instance.RefreshEventData);
ThreadPool.QueueUserWorkItem(Database.Instance.RefreshLocationData);
ThreadPool.QueueUserWorkItem(Database.Instance.RefreshActData);

第一点是 - 可以像这样调用调用 WCF 服务的方法吗?我尝试用菊花链连接它们,结果一团糟。

上面调用的刷新方法之一的示例是(它们都遵循相同的模式,只是调用不同的服务并填充不同的表):

public void RefreshEventData (object state)
{
Console.WriteLine ("in RefreshEventData");
var eservices = new AppServicesClient (new BasicHttpBinding (), new EndpointAddress (this.ServciceUrl));

//default the delta to an old date so that if this is first run we get everything
var eventsLastUpdated = DateTime.Now.AddDays (-100);

try {
eventsLastUpdated = (from s in GuideStar.Data.Database.Main.Table<GuideStar.Data.Event> ()
orderby s.DateUpdated descending
select s).ToList ().FirstOrDefault ().DateUpdated;

} catch (Exception ex1) {
Console.WriteLine (ex1.Message);
}

try {
eservices.GetAuthorisedEventsWithExtendedDataAsync (this.User.Id, this.User.Password, eventsLastUpdated);
} catch (Exception ex) {
Console.WriteLine ("error updating events: " + ex.Message);
}

eservices.GetAuthorisedEventsWithExtendedDataCompleted += delegate(object sender, GetAuthorisedEventsWithExtendedDataCompletedEventArgs e) {

try {

List<Event> newEvents = e.Result.ToList ();

GuideStar.Data.Database.Main.EventsAdded = e.Result.Count ();

lock (GuideStar.Data.Database.Main) {
GuideStar.Data.Database.Main.Execute ("BEGIN");

foreach (var s in newEvents) {

GuideStar.Data.Database.Main.InsertOrUpdateEvent (new GuideStar.Data.Event {
Name = s.Name,
DateAdded = s.DateAdded,
DateUpdated = s.DateUpdated,
Deleted = s.Deleted,
StartDate = s.StartDate,
Id = s.Id,
Lat = s.Lat,
Long = s.Long
});

}

GuideStar.Data.Database.Main.Execute ("COMMIT");
LocationsCount = 0;
}
} catch (Exception ex) {
Console.WriteLine("error InsertOrUpdateEvent " + ex.Message);
} finally {
OnDatabaseUpdateStepCompleted (EventArgs.Empty);
}

};
}

OnDatabaseUpdateStepCompleted - 仅在调用时迭代 updateComplete 计数器,并且当它知道所有服务均已恢复正常时,它会删除等待的微调器,应用程序将继续运行。

这第一次工作正常 - 但有时它不适用于以下之一:http://monobin.com/__m6c83107d

我认为第一个问题是 - 这一切都好吗?我不习惯使用线程和锁,所以我正在探索新的领域。像这样使用 QueueUserWorkItem 可以吗?在进行批量插入/更新之前我是否应该使用锁?一个例子:

public void InsertOrUpdateEvent(Event festival){

try {
if (!festival.Deleted) {
Main.Insert(festival, "OR REPLACE");
}else{
Main.Delete<Event>(festival);
}
} catch (Exception ex) {
Console.WriteLine("InsertOrUpdateEvent failed: " + ex.Message);
}

}

那么下一个问题是 - 我做错了什么导致这些 sqlite 问题?

w://

最佳答案

Sqlite 不是线程安全的。

如果您想从多个线程访问 Sqlite,则必须在访问任何 SQLite 相关结构之前获取一把锁。

像这样:

lock (db){
// Do your query or insert here
}

关于iphone - Monotouch 数据同步 - 为什么我的代码有时会导致 sqlite 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com