C# 排序WPF datagrid使用IsAsync绑定挂起整个GUI

C# 排序WPF datagrid使用IsAsync绑定挂起整个GUI,c#,wpf,asynchronous,.net-core,C#,Wpf,Asynchronous,.net Core,我的WPF应用程序中有此IsUpdate属性: public bool已更新 { 得到 { 如果(_isUpdated.HasValue) { 返回_isUpdated.Value; } var available=getAvailableEversion().Result; var installed=GetInstalledVersion().Result; _isUpdated=IsInstalled&&new Version(可用)。与(new Version(installed))相比

我的WPF应用程序中有此IsUpdate属性:

public bool已更新
{
得到
{
如果(_isUpdated.HasValue)
{
返回_isUpdated.Value;
}
var available=getAvailableEversion().Result;
var installed=GetInstalledVersion().Result;

_isUpdated=IsInstalled&&new Version(可用)。与(new Version(installed))相比,我不知道您是不是这样做的,但这对我来说很好。 在将值指定给字段后,可能需要激发已更改的属性。 在异步操作完成之前,该字段为空。当最终检索到该值时,应通知UI

if (!_field.HasValue)
{

    Task.Run(() => <DoAsyncStuff>)
    .ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            <Error>
        }
        else
        {
            _field = task.Result
        }

    }, TaskScheduler.FromCurrentSynchronizationContext());  

}

return _field;
if(!\u field.HasValue)
{
Task.Run(()=>)
.ContinueWith(任务=>
{
if(task.IsFaulted)
{
}
其他的
{
_字段=任务。结果
}
},TaskScheduler.FromCurrentSynchronizationContext());
}
返回_字段;

FromCurrentSynchronizationContext
很重要,您需要再次在UI线程上继续执行
操作,否则不会更改任何属性。

.Result
中的
GetAvailableReversion().Result
是同步的。我知道,但是有没有一种方法可以在不阻塞的情况下解决此问题?您可以进行检查,并且属性不应该调用长时间运行的操作。从调用方法更有意义的地方调用方法,然后在实际获得结果后设置
IsUpdated
属性。我有一个例外:System.invalidoOperationException:“当前SynchronizationContext不能用作TaskScheduler。”我尝试了以下操作:
Task.Run(async()=>(新版本(await GetAvailableVersion())。CompareTo(新版本(await GetInstalledVersion()){IsUpdate=t.Result;},TaskScheduler.FromCurrentSynchronizationContext())
我认为您可以在Task.Run中编写代码。同步运行。不使用async和Wait,而是使用.Result(或者更好的是.GetAwaiter().GetResult()afair)