Xamarin.forms Xamarin表单-从错误线程访问的域
也许我错过了一些非常简单的事情,但无论如何我还是要问 我使用的是Xamarin表单(.NET标准项目)、MVVMLight、Realm DB和ZXing条形码扫描仪 我有一个像这样的真实对象Xamarin.forms Xamarin表单-从错误线程访问的域,xamarin.forms,realm,mvvm-light,.net-standard-2.0,zxing.net,Xamarin.forms,Realm,Mvvm Light,.net Standard 2.0,Zxing.net,也许我错过了一些非常简单的事情,但无论如何我还是要问 我使用的是Xamarin表单(.NET标准项目)、MVVMLight、Realm DB和ZXing条形码扫描仪 我有一个像这样的真实对象 public class Participant : RealmObject { public string FirstName {get; set;} public string LastName {get; set;} public string Email {get; set;
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
}
}
并调用下面的方法(通过ScanResultCommand连接)获取带有扫描注册码的参与者
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:从错误线程访问的域。
由下面的行生成
SelectedParticipant=Participants.FirstOrDefault(p=>p.RegistrationCode.Equals(regCode,StringComparison.OrdinalIgnoreCase))强>
我不确定这是不是一个错误的线程,但如果我能想出一些办法,从已经填充的IQueryable或直接从领域表示中获取扫描的参与者,我将不胜感激
谢谢是的,您将在构造函数中获得一个领域实例,然后从异步任务(或线程)中使用它。您只能从获取引用的线程访问域。因为您只使用默认实例,所以应该能够在使用它的函数(或线程)中简单地获取本地引用。试用
Realm LocalInstance = Realms.Realm.GetInstance();
在函数的顶部,并使用它。您需要重新创建参与者
查询,以使用与其源相同的实例。无论您在何处使用异步任务(线程),都会出现这种情况,因此要么更改all以获得条目上的默认实例,要么减少访问领域的线程数量
顺便说一句,我很惊讶在
RefreshParticipants()
-也许您并没有从那里通过RealMinInstance
访问数据。谢谢您的回复。获取一个单独的realm本地实例不起作用,因为我有其他代码位使用IQueryable,并且我一直得到相同的错误。然而,你回答的第一句话帮助我找到了解决办法。我从RefreshAttendes()中删除了“async Task”签名,因为它是多余的,即不使用Wait anywhere调用它。有了这个RealMinInstance,它现在正在主线程上运行,所以我在ScanResults方法中使用了Device.BeginInvokeOnMainThread。这就成功了。将你的回答标记为答案。干杯
Realm LocalInstance = Realms.Realm.GetInstance();