C# 从主页调用任务的正确方法是什么
如果await只能由异步方法使用,如何从MainPage()调用任务 我的代码示例:C# 从主页调用任务的正确方法是什么,c#,xamarin,task,C#,Xamarin,Task,如果await只能由异步方法使用,如何从MainPage()调用任务 我的代码示例: public MainPage() { InitializeComponent(); label.Text=await Task.Run(TaskTest); //this doesn't work } private async Task<string> TaskTest() { try { using (WebCl
public MainPage()
{
InitializeComponent();
label.Text=await Task.Run(TaskTest); //this doesn't work
}
private async Task<string> TaskTest()
{
try
{
using (WebClient client = new WebClient())
{
return await client.DownloadStringTaskAsync("https://www.example.com/return.php");
//also tried w/ no success:
//return client.DownloadStringTaskAsync("https://www.example.com/return.php").Result;
}
}
catch (Exception)
{
throw;
}
}
public主页()
{
初始化组件();
label.Text=wait Task.Run(TaskTest);//这不起作用
}
专用异步任务TaskTest()
{
尝试
{
使用(WebClient=newWebClient())
{
返回等待客户端。下载StringTaskAsync(“https://www.example.com/return.php");
//也尝试过但没有成功:
//返回client.downloadstringtasksync(“https://www.example.com/return.php三、结果;
}
}
捕获(例外)
{
投掷;
}
}
不能使Main()
方法异步,因此,可以在Main()
函数体中使用wait
关键字
通过编辑当前代码可以实现的一个简单解决方法是使函数TaskTest()
返回void
,这样就不必等待它的调用
示例:
public MainPage()
{
InitializeComponent();
TaskTest();
}
private async void TaskTest()
{
try
{
using (WebClient client = new WebClient())
{
label.Text = await client.DownloadStringTaskAsync("https://www.example.com/return.php");
}
}
catch (Exception)
{
throw;
}
}
编辑
如果您必须等待异步调用的返回值而不使用wait
,您可以继续并使用一段时间来检查任务是否已完成
Task<string> accessTokenTask = Task.Run<string>(() => MethodToGetToken());
// wait until operation is done.
while(!accessTokenTask.IsCompleted)
{
accessTokenTask.Wait():
}
// once the task completes, the runtime will step out of the while loop
// and you can access your Token in the Result
string token = accessTokenTask.Result;
Task accessTokenTask=Task.Run(()=>MethodToGetToken());
//等待操作完成。
而(!accessTokenTask.IsCompleted)
{
accessTokenTask.Wait():
}
//任务完成后,运行时将退出while循环
//您可以在结果中访问您的令牌
string token=accessTokenTask.Result;
希望这能回答您的问题。避免异步void
激发并忘记方法
但是,事件处理程序是该规则的唯一例外
参考文献
在本例中,由于您希望等待任务,因此需要创建事件和处理程序,以促进所需的行为
public MainPage() {
InitializeComponent();
Downloading += OnDownloading; //subscribe to event
Downloading(this, EventArgs.Empty); //raise event to be handled
}
private event EventHandler Downloading = delegate { };
private async void OnDownloading(object sender, EventArgs args) {
//Downloading -= OnDownloading; //unsubscribe (optional)
label.Text = await TaskTest(); //this works
}
private async Task<string> TaskTest() {
try {
using (WebClient client = new WebClient()) {
return await client.DownloadStringTaskAsync("https://www.example.com/return.php");
}
} catch (Exception) {
throw;
}
}
public主页(){
初始化组件();
下载+=OnDownloading;//订阅事件
正在下载(this,EventArgs.Empty);//引发要处理的事件
}
私有事件处理程序下载=委托{};
私有异步void OnDownloading(对象发送方、事件args args){
//下载-=OnDownloading;//取消订阅(可选)
label.Text=await TaskTest();//这很有效
}
专用异步任务TaskTest(){
试一试{
使用(WebClient=newWebClient()){
返回等待客户端。下载StringTaskAsync(“https://www.example.com/return.php");
}
}捕获(例外){
投掷;
}
}
您可能不应该从主页
调用您的任务。我从VisualStudio空白页开始,并尝试做同样的事情。我找到了一个建议使用wait-Navigation.PushModalAsync(NewPage)的答案
,然后在那里调用任务task.Run(async()=>{await method();}).Wait()代码>。它起作用了,但是
<>这很有助于初学者在空白页面项目中添加<代码> MVVM < /代码>。您只需将视图模型
绑定到主页
,然后从视图模型
调用您的任务
public MainPage()
{
InitializeComponent();
this.BindingContext = new MainPageViewModel(this);
}
你没有。构造函数不是用来创建异步流的。您可能希望看到label.Text=wait Task.Run非常混乱。UI在单独的线程上运行。您可能需要为等待任务分配一个值,然后将其分配给label.Text。谢谢,@machariadev!但是如果我想等?例如,如果返回的字符串实际上是一个登录令牌,我必须等待它的响应来显示一些数据或否。你能给我这个帮助吗?