C# 如何在.NET(Xamarin UWP)中创建的同一线程中访问域实例?
我正在Xamarin表单中的一个应用程序中进行从SQLite/WebAPI到领域的迁移 此应用程序管理消息服务(通过信号器聊天) 出现的问题是,当收到一条消息(我试图将其存储在数据库中)时,应用程序意外崩溃。(SQLite没有遇到的问题) 我遇到了一个著名的错误:从不正确的访问的领域,恰好在第三条或第四条消息试图插入时,有点难以看到确切的时刻 正如我所读到的,在Stackoverflow和GitHub上的问题中。必须在创建实例的同一线程中访问该实例 正如他们所建议的,实现这一点的一种方法是通过C# 如何在.NET(Xamarin UWP)中创建的同一线程中访问域实例?,c#,xamarin,uwp,realm,synchronizationcontext,C#,Xamarin,Uwp,Realm,Synchronizationcontext,我正在Xamarin表单中的一个应用程序中进行从SQLite/WebAPI到领域的迁移 此应用程序管理消息服务(通过信号器聊天) 出现的问题是,当收到一条消息(我试图将其存储在数据库中)时,应用程序意外崩溃。(SQLite没有遇到的问题) 我遇到了一个著名的错误:从不正确的访问的领域,恰好在第三条或第四条消息试图插入时,有点难以看到确切的时刻 正如我所读到的,在Stackoverflow和GitHub上的问题中。必须在创建实例的同一线程中访问该实例 正如他们所建议的,实现这一点的一种方法是通过A
AsyncContext使用正确的同步上下文
我问这个问题是因为不幸的是,我在一个基本的层次上处理线程和任务的主题,我必须以什么方式接近前面对代码的建议?或者我应该正确设置什么来访问创建它的线程
这是我的代码:
LobbyViewModel
public LobbyViewModel()
{
ChatService.OnReceivePrivateMessage += ChatService_OnReceivePrivateMessage;
}
private async void ChatService_OnReceivePrivateMessage(object sender, MessageEventArgs args)
{
await SendMessage(…);
}
private async Task SendMessage(…)
{
await UpdateMetaData(…);
}
public async Task UpdateMetaData(…)
{
await ManagerService.InsertMetaDataChatAsync(metaDataChat);
}
ManagerService
public async Task InsertMetaDataChatAsync (MetaDataChatModel MetaDataChatModel)
{
IMetaDataChatServices MetaDataChatServices = App.AppContainer.Resolve<IMetaDataChatServices>();
IResponse DataResult = (await MetaDataChatServices.Insert(MetaDataChatModel));
}
Repository
public async Task<IResponse> CreateAsync(MetaDataChatModel MetaDataChatModel)
{
MetaDataChatModel.Id = Guid.NewGuid().ToString();
MetaDataChatModel.Partition = _realmManager.projectPartition;
var MetaDataChatDto = MetaDataChatModel.ToDto();
var realmInstance = await _realmManager.GetInstanceAsync();
if (realmInstance == null)
return new Response(false, "Realm instance can't be null");
await realmInstance.WriteAsync(realm =>
{
realm.Add(MetaDataChatDto, false);
});
return new Response(true);
}
RealmManager
public RealmManager()
{
RealmApp = App.Create(appId);
//DataBase = Realms.Realm.GetInstance(syncConfig);
}
public Task<Realms.Realm> GetInstanceAsync()
{
return Realms.Realm.GetInstanceAsync(syncConfig);
}
public async Task RealmLogInAsync()
{
if (RealmApp.CurrentUser == null)
{
User user = await RealmApp.
LogInAsync(Credentials.EmailPassword("email", "password"));
if (user == null)
{
return;
}
}
projectPartition = $"project={RealmApp.CurrentUser.Id}";
syncConfig = new SyncConfiguration(projectPartition, RealmApp.CurrentUser);
}
public async Task RealmLogOutAsync()
{
if (RealmApp != null && RealmApp.CurrentUser!=null)
{
await RealmApp.CurrentUser?.LogOutAsync();
}
}
LobbyViewModel
公共游说视图模型()
{
ChatService.OnReceivePrivateMessage+=ChatService\u OnReceivePrivateMessage;
}
private async void ChatService_OnReceivePrivateMessage(对象发送方,MessageEventArgs args args)
{
等待发送消息(…);
}
专用异步任务SendMessage(…)
{
等待更新元数据(…);
}
公共异步任务UpdateMetaData(…)
{
wait ManagerService.InsertMetaDataChatAsync(metaDataChat);
}
管理服务
公共异步任务InsertMetaDataChatAsync(MetaDataChatModel MetaDataChatModel)
{
IMetaDataChatServices MetaDataChatServices=App.AppContainer.Resolve();
IResponse DataResult=(等待MetaDataChatServices.Insert(MetaDataChatModel));
}
存储库
公共异步任务CreateAsync(MetaDataChatModel MetaDataChatModel)
{
MetaDataChatModel.Id=Guid.NewGuid().ToString();
MetaDataChatModel.Partition=\u realmanager.projectPartition;
var MetaDataChatDto=MetaDataChatModel.ToDto();
var realmInstance=await_realmanager.GetInstanceAsync();
if(realmInstance==null)
返回新响应(false,“领域实例不能为null”);
wait realmInstance.WriteAsync(realm=>
{
realm.Add(MetaDataChatDto,false);
});
返回新的响应(true);
}
RealmManager
公共realmanager()
{
RealmApp=App.Create(appId);
//DataBase=Realms.Realm.GetInstance(syncConfig);
}
公共任务GetInstanceAsync()
{
返回Realms.Realm.GetInstanceAsync(syncConfig);
}
公共异步任务RealmLogInAsync()
{
if(RealmApp.CurrentUser==null)
{
User=等待RealmApp。
LogInAsync(Credentials.EmailPassword(“email”,“password”));
if(user==null)
{
返回;
}
}
projectPartition=$“project={RealmApp.CurrentUser.Id}”;
syncConfig=新的SyncConfiguration(projectPartition,RealmApp.CurrentUser);
}
公共异步任务RealmLogOutAsync()
{
if(RealmApp!=null&&RealmApp.CurrentUser!=null)
{
等待RealmApp.CurrentUser?.LogOutAsync();
}
}
Hi@Ivanrlg您的代码有点混乱。你能在你的代码片段中突出显示在哪一点你得到了异常吗?嗨@papafe我试着清理一下。此处出现异常:公共异步任务CreateAsync(MetaDataChatModel MetaDataChatModel)
。我认为在某个点上,当另一个线程也在插入时,它还没有完成插入,并且出现了崩溃。@Ivanrlg只是为了确定,在CreateAsync
中,您有realm.Add(MetadataChadto)
。实际上是realmInstance.Add(MetadataChatto)
还是我遗漏了什么?Hello@papafe,这是realm.Add(MetadataChatto,false);。在内部使用领域。此处引用:[链接]啊,是的,对不起,我误读了,我的错!:)