Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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# 从主页调用任务的正确方法是什么_C#_Xamarin_Task - Fatal编程技术网

C# 从主页调用任务的正确方法是什么

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

如果await只能由异步方法使用,如何从MainPage()调用任务

我的代码示例:

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!但是如果我想等?例如,如果返回的字符串实际上是一个登录令牌,我必须等待它的响应来显示一些数据或否。你能给我这个帮助吗?