gpt4 book ai didi

xamarin.forms - Xamarin 表单 - 从不正确的线程访问的 Realm

转载 作者:行者123 更新时间:2023-12-05 04:01:41 26 4
gpt4 key购买 nike

也许我在这里遗漏了一些非常简单的东西,但无论如何还是要问......

我正在使用 Xamarin 表单(.NET Standard 项目)、MVVMLight、Realm DB 和 ZXing Barcode Scanner。

我有一个像这样的 Realm 对象......

public class Participant : RealmObject
{
public string FirstName {get; set;}
public string LastName {get; set;}
public string Email {get; set;}
public string RegistrationCode {get; set;}

//More properties skipped out for brevity
}

我有对应的viewmodel如下:

public class ParticipantViewModel
{
Realm RealmInstance
public ParticipantViewModel()
{
RealmInstance = Realms.Realm.GetInstance();
RefreshParticipants();
}

private async Task RefreshParticipants()
{
//I have code here that GETS the list of Participants from an API and saves to the device.
//I am using the above-defined RealmInstance to save to IQueryable<Participant> Participants
}
}

以上所有工作正常,我对此没有任何问题。在同一个 View 模型中,我还能够启动 ZXing 扫描仪并扫描代表 RegistrationCode 的条形码。

这反过来会在扫描后填充以下属性(也在 View 模型中)...

    private ZXing.Result result;
public ZXing.Result Result
{
get { return result; }
set { Set(() => Result, ref result, value); }
}

并调用以下方法(通过 ScanResultCommand 连接)来获取带有扫描的 RegistrationCode 的参与者。

    private async Task ScanResults()
{
if (Result != null && !String.IsNullOrWhiteSpace(Result.Text))
{
string regCode = Result.Text;
await CloseScanner();
SelectedParticipant = Participants.FirstOrDefault(p => p.RegistrationCode.Equals(regCode, StringComparison.OrdinalIgnoreCase));
if (SelectedParticipant != null)
{
//Show details for the scanned Participant with regCode
}
else
{
//Display not found message
}
}
}

我一直收到以下错误....

System.Exception:从不正确的线程访问的 Realm 。

由下面的行生成....

SelectedParticipant = Participants.FirstOrDefault(p => p.RegistrationCode.Equals(regCode, StringComparison.OrdinalIgnoreCase));

我不确定这是一个不正确的线程,但如果有任何关于如何从已经填充的 IQueryable 或直接从 Realm 表示中获取扫描的参与者的想法,我们将不胜感激。

谢谢

最佳答案

是的,您在构造函数中获取了一个 Realm 实例,然后从异步任务(或线程)中使用它。您只能从获得引用的线程访问 Realm 。由于您只使用默认实例,因此您应该能够简单地在您使用它的函数(或线程)中获取本地引用。尝试使用

    Realm LocalInstance = Realms.Realm.GetInstance();

在函数的顶部并使用它。您需要重新创建 Participants 查询以使用相同的实例作为其源。在任何使用异步任务(线程)的地方都会出现这种情况,因此要么全部更改以在进入时保留默认实例,要么减少访问该 Realm 的线程数。

顺便说一句,我很惊讶你没有从 中得到类似的访问错误
RefreshParticipants()
- 也许您实际上并没有从那里通过 RealmInstance 访问数据。

关于xamarin.forms - Xamarin 表单 - 从不正确的线程访问的 Realm ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55153307/

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