Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.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# 如何在viewmodel中执行异步任务后更新UI_C#_Async Await_Xamarin.forms_Mvvm Light - Fatal编程技术网

C# 如何在viewmodel中执行异步任务后更新UI

C# 如何在viewmodel中执行异步任务后更新UI,c#,async-await,xamarin.forms,mvvm-light,C#,Async Await,Xamarin.forms,Mvvm Light,在我的Xamarin.Formspcl项目中,我有一个带有标签的xaml页面。我想在一些异步任务之后更新标签。在我的视图模型构造函数中我为我的标签设置了默认文本。并创建一个名为SomeTask()的async Task函数 问题1:在哪里可以调用SomeTask()函数。无法调用构造函数中的异步任务函数 问题2:如何更新标签异步任务SomeTask()后的文本函数 我的代码: public class MyPageViewModel : ViewModelBase {

在我的
Xamarin.Forms
pcl项目中,我有一个带有
标签的
xaml
页面。我想在一些
异步任务之后更新
标签
。在我的视图模型
构造函数中
我为我的
标签设置了默认文本。并创建一个名为
SomeTask()
async Task
函数

问题1:在哪里可以调用
SomeTask()
函数。无法调用
构造函数中的
异步任务
函数

问题2:如何更新
标签
异步任务SomeTask()后的文本
函数

我的代码:

  public class MyPageViewModel : ViewModelBase
    {  
        private String _selectedText;
        public String SelectedText
        {
            get { return _selectedText; }
            set {
                if (_selectedText != value)
                {
                    _selectedText = value;          
                }       
            }
        }

        public MyPageViewModel ()
        {
            _selectedText = "Welcome";   //Default text
        }

        private async Task<string> SomeTask()
        {            
            return await Task.Run(async () =>
            {
                await Task.Delay(3000); //Dummy task. It will return the status of Task.
                return "Thanks";         //Update Text       
            });         
        }
    }
公共类MyPageViewModel:ViewModelBase
{  
私有字符串\u选择的文本;
公共字符串SelectedText
{
获取{return\u selectedText;}
设置{
如果(_selectedText!=值)
{
_selectedText=值;
}       
}
}
公共MyPageViewModel()
{
_selectedText=“Welcome”;//默认文本
}
私有异步任务SomeTask()
{            
返回等待任务。运行(异步()=>
{
等待任务。延迟(3000);//虚拟任务。它将返回任务的状态。
返回“谢谢”;//更新文本
});         
}
}
怎么样

public MyPageViewModel()
{
    _selectedText = "Welcome";   //Default text
    SomeTask().ContinueWith(previousTask => SelectedText = previousTask.Result);
}
怎么样

public MyPageViewModel()
{
    _selectedText = "Welcome";   //Default text
    SomeTask().ContinueWith(previousTask => SelectedText = previousTask.Result);
}

您可以创建一个异步工厂方法并使构造函数私有。然后调用该方法来创建
MyPageViewModel
的实例。在该方法中,您可以调用
string str=wait SomeTask

public class MyPageViewModel : ViewModelBase
{  
     public async MyPageViewModel CreateAsync()
     {
         var model = new MyPageViewModel();

         SelectedText = await SomeTask();

         return model;
     }        

     private MyPageViewModel ()
     {
         _selectedText = "Welcome";   //Default text
     }

     private Task<string> SomeTask()
     {            
         return Task.Run(async () =>
         {
             await Task.Delay(3000); //Dummy task. It will return the status of Task.
             return "Thanks";         //Update Text       
         });         
      }
}
您可以这样创建它:

var model = new MyPageViewModel();
var model = await MyPageViewModel.CreateAsync();

您可以创建一个异步工厂方法并使构造函数私有。然后调用该方法来创建
MyPageViewModel
的实例。在该方法中,您可以调用
string str=wait SomeTask

public class MyPageViewModel : ViewModelBase
{  
     public async MyPageViewModel CreateAsync()
     {
         var model = new MyPageViewModel();

         SelectedText = await SomeTask();

         return model;
     }        

     private MyPageViewModel ()
     {
         _selectedText = "Welcome";   //Default text
     }

     private Task<string> SomeTask()
     {            
         return Task.Run(async () =>
         {
             await Task.Delay(3000); //Dummy task. It will return the status of Task.
             return "Thanks";         //Update Text       
         });         
      }
}
您可以这样创建它:

var model = new MyPageViewModel();
var model = await MyPageViewModel.CreateAsync();
我建议你使用;这在我的中有描述,我认为这是最简单的方法:

public class MyPageViewModel : ViewModelBase
{
  private NotifyTask<string> _selectedText;
  public NotifyTask<string> SelectedText => _selectedText;

  public MyPageViewModel()
  {
    _selectedText = NotifyTask.Create(SomeTask(), "Welcome");
  }

  private async Task<string> SomeTask()
  {            
    await Task.Delay(3000);
    return "Thanks";
  }
}
构造函数启动
RunSomeTask
操作,然后显式忽略其结果(请注意,这意味着将忽略所有异常)。
RunSomeTask
负责运行
SomeTask
并处理其结果(和异常)。结果仅用于更新
SelectedText
,例外情况将按您认为适合您的应用程序的方式处理。

我建议您使用;这在我的中有描述,我认为这是最简单的方法:

public class MyPageViewModel : ViewModelBase
{
  private NotifyTask<string> _selectedText;
  public NotifyTask<string> SelectedText => _selectedText;

  public MyPageViewModel()
  {
    _selectedText = NotifyTask.Create(SomeTask(), "Welcome");
  }

  private async Task<string> SomeTask()
  {            
    await Task.Delay(3000);
    return "Thanks";
  }
}

构造函数启动
RunSomeTask
操作,然后显式忽略其结果(请注意,这意味着将忽略所有异常)。
RunSomeTask
负责运行
SomeTask
并处理其结果(和异常)。结果仅用于更新
SelectedText
,例外情况将按您认为适合您的应用程序的方式处理。

问题1:

使用委托和事件

  • 创建委托和关联事件:

    • private delegate void MyDelegate()
    • 私有事件MyDelegate myEvent
  • 订阅构造函数中的事件:

    • myEvent+=async()=>wait SomeTask()
  • 在需要时执行事件:

    • myEvent()//注意:在执行之前,检查事件是否为空
  • 问题2:

    如果在非UI线程上,则:

    • 使用一些框架类来执行UI操作:例如-Xamarin提供Device.BeginInvokeOnMainThread

    • 我们可以始终使用标签的数据绑定,并且仅使用事件订阅从ViewModel更新绑定路径的值


    string\u消息;
    公共字符串消息
    {
    获取=>\u消息;
    设置
    {
    _消息=值;
    }
    }
    myEvent+=()=>Message=“新值”;
    
    问题1:

    使用委托和事件

  • 创建委托和关联事件:

    • private delegate void MyDelegate()
    • 私有事件MyDelegate myEvent
  • 订阅构造函数中的事件:

    • myEvent+=async()=>wait SomeTask()
  • 在需要时执行事件:

    • myEvent()//注意:在执行之前,检查事件是否为空
  • 问题2:

    如果在非UI线程上,则:

    • 使用一些框架类来执行UI操作:例如-Xamarin提供Device.BeginInvokeOnMainThread

    • 我们可以始终使用标签的数据绑定,并且仅使用事件订阅从ViewModel更新绑定路径的值


    string\u消息;
    公共字符串消息
    {
    获取=>\u消息;
    设置
    {
    _消息=值;
    }
    }
    myEvent+=()=>Message=“新值”;
    
    您可以从构造函数中调用它-尽管您不能等待它(这里的差别很小)。您不能执行
    string ret=wait task…,而不是返回任务/*更新文本*/返回ret?您可以创建一个异步工厂方法并使构造函数私有。然后调用该方法来创建
    MyPageViewModel
    的实例。在该方法中,您可以调用
    string str=wait SomeTask
    您可以从构造函数中调用它,尽管您不能等待它(差别很小)。您不能执行
    string ret=wait task…,而不是返回任务/*更新文本*/返回ret?您可以创建一个异步工厂方法并