Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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# WPF螺纹锁紧装置_C#_Wpf_Api_Xaml_Ef Core 2.0 - Fatal编程技术网

C# WPF螺纹锁紧装置

C# WPF螺纹锁紧装置,c#,wpf,api,xaml,ef-core-2.0,C#,Wpf,Api,Xaml,Ef Core 2.0,我可以从你那里找到有用的答案吗。 我让WPF应用程序从API获取数据,当我触发以下代码时,我有线程死锁 private List<Clinic> _clinics; public List<Clinic> Clinics { get { return _clinics; } set { _clinics = value; OnPropertyChanged(); } } pr

我可以从你那里找到有用的答案吗。 我让WPF应用程序从API获取数据,当我触发以下代码时,我有线程死锁

private List<Clinic> _clinics;
        public List<Clinic> Clinics {
            get { return _clinics; }
            set { _clinics = value; OnPropertyChanged(); }
        }

        private Clinic _selectedClinic;
        public Clinic SelectedClinic {
            get { return _selectedClinic; }
            set {
                _selectedClinic = value; OnPropertyChanged();
                if (value != null)
                    OnSelectClinic(value).Wait();
            }
        }
private async Task OnSelectClinic(Clinic clinic) {
            try {
using (var request = await Client.GetAsync("URL OF API")) {
                if (request.IsSuccessStatusCode){
StaffList = await request.Content.ReadAsAsync<Staff>();
}

                var error = await request.Content.ReadAsStringAsync();
                throw new Exception(error);
            }
            } catch (Exception e) {
                Debug.WriteLine(e);
            }
        }
这是视图模型,Clinics、selectedClinic和Staff都绑定到view.XAML

下面是API方法

[HttpGet("FindAllByClinic/{clinicId}")]
        public async Task<IActionResult> FindAllByClinic(int clinicId) {
            try {
                return Ok(_mapper.Map<List<Staff>>(await _staffRepository
                    .FindAllBy(clinicId)));
            } catch (Exception e) {
                return BadRequest(e.Message);
            }
        }
以下是StaffRepository方法:

public async Task<ICollection<Staff>> FindAllBy(int clinicId, int medicalPointId) {
            var persons = await Context.Persons.FromSql("EXEC HR.GetPersonsByClinicId @ClinicId = 0," +
                                                        $"@EncryptPassword = '{DecryptPassword}'").ToListAsync();

            var staffs = await Context.Staff
                .Include(e => e.StaffClinics)
                .ThenInclude(e => e.Clinic)
                .ThenInclude(e => e.ClinicMedicalPoints)
                .Where(e => e.StaffClinics.Any(c => c.ClinicId == clinicId
                                                    && c.Clinic.ClinicMedicalPoints.Any(m => m.MedicalPointId
                                                    == medicalPointId)))
                .ToListAsync();

            foreach (var staff in staffs) {
                staff.Person = persons.FirstOrDefault(e => e.Id == staff.PersonId);
            }

            return staffs;
        }
问题是,当我从组合框中选择诊所时,整个应用程序将冻结 如果我有错误,有人能给我建议或更正我的代码吗请

公共诊所选择诊所{ 获取{return\u selectedClinic;} 设置{ _selectedClinic=value;OnPropertyChanged; 如果值!=null onselect值。等待; } } 此setter非常糟糕,因为:

它会引发一个带有OnPropertyChanged的事件—这没关系—但随后它会继续在setters主体中执行代价高昂的操作。您已经在启动一个事件,也许应该订阅它并执行OnSelectClinic

。通常,解决方案是将阻塞等待替换为等待,但在这种情况下,您需要重新设计,以便属性设置程序不负责触发和等待此操作


onselect值。等待;那就是坏蛋。属性无论如何都阻止了调用,而不是异步的,除了设置一个支持字段之外,在属性中做任何事情都是错误的,并且会导致类似您所看到的问题。请参阅链接↓您应该在SelectClinic上移动到事件,而不是在属性集上。这将解决您的问题。它引发了一个OnPropertyChanged事件。当然,这是您放置的位置,否则您将如何处理;这并不是非常糟糕。@đěxěŕ是的,我不反对这一点,我反对它在那之后执行一个可能长时间运行的异步操作-这不是人们期望属性设置程序做的事情,这是问题的直接原因,因为它强制阻塞该操作。希望我的编辑能让它更清晰。谢谢你的更新!那么,当我选择诊所时,如何进行异步调用以从API加载人员?@MajdAlbaho首先想到的是,将其移动到一个单独的事件处理程序中,该事件处理程序对该属性引发的PropertyChangedEvent作出反应。