Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET(Xamarin UWP)中创建的同一线程中访问域实例?_C#_Xamarin_Uwp_Realm_Synchronizationcontext - Fatal编程技术网

C# 如何在.NET(Xamarin UWP)中创建的同一线程中访问域实例?

C# 如何在.NET(Xamarin UWP)中创建的同一线程中访问域实例?,c#,xamarin,uwp,realm,synchronizationcontext,C#,Xamarin,Uwp,Realm,Synchronizationcontext,我正在Xamarin表单中的一个应用程序中进行从SQLite/WebAPI到领域的迁移 此应用程序管理消息服务(通过信号器聊天) 出现的问题是,当收到一条消息(我试图将其存储在数据库中)时,应用程序意外崩溃。(SQLite没有遇到的问题) 我遇到了一个著名的错误:从不正确的访问的领域,恰好在第三条或第四条消息试图插入时,有点难以看到确切的时刻 正如我所读到的,在Stackoverflow和GitHub上的问题中。必须在创建实例的同一线程中访问该实例 正如他们所建议的,实现这一点的一种方法是通过A

我正在Xamarin表单中的一个应用程序中进行从SQLite/WebAPI到领域的迁移

此应用程序管理消息服务(通过信号器聊天)

出现的问题是,当收到一条消息(我试图将其存储在数据库中)时,应用程序意外崩溃。(SQLite没有遇到的问题)

我遇到了一个著名的错误:从不正确的访问的领域,恰好在第三条或第四条消息试图插入时,有点难以看到确切的时刻

正如我所读到的,在Stackoverflow和GitHub上的问题中。必须在创建实例的同一线程中访问该实例

正如他们所建议的,实现这一点的一种方法是通过
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);。在内部使用领域。此处引用:[链接]啊,是的,对不起,我误读了,我的错!:)