Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
Xamarin.forms Xamarin表单-从错误线程访问的域_Xamarin.forms_Realm_Mvvm Light_.net Standard 2.0_Zxing.net - Fatal编程技术网

Xamarin.forms Xamarin表单-从错误线程访问的域

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;

也许我错过了一些非常简单的事情,但无论如何我还是要问

我使用的是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 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();