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代码>?您可以创建一个异步工厂方法并