Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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# 使用异步框架进行web调用_C#_Visual Studio 2012_C# 5.0 - Fatal编程技术网

C# 使用异步框架进行web调用

C# 使用异步框架进行web调用,c#,visual-studio-2012,c#-5.0,C#,Visual Studio 2012,C# 5.0,我正在使用async框架进行web调用。我在下面的代码中发现了一个错误 class Program { static void Main(string[] args) { TestAsync async = new TestAsync(); await async.Go();//Error: the await operator can only be used with an async method. Consider markign th

我正在使用
async
框架进行web调用。我在下面的代码中发现了一个错误

class Program
{
    static void Main(string[] args)
    {
        TestAsync async = new TestAsync();
        await async.Go();//Error:  the await operator can only be used with an async method.  Consider markign this method with the async modifier.  Consider applying the await operator to the result of the call
    }
}

class TestAsync
{
    public async Task Go()
    {
        using (WebClient client = new WebClient())
        {
            var myString =  await client.DownloadStringTaskAsync("http://msdn.microsoft.com");
            Console.WriteLine(myString);
        }    
    }
}
我已经尝试了这段代码的几种变体。它要么在运行时失败,要么不编译。在这种情况下,该方法在允许启动异步调用之前完成。我做错了什么

我的目标是以异步方式使用WebClient执行对网站的调用。我想以字符串形式返回结果,并使用
Console.WriteLine
将其打印出来。如果您觉得从执行简单更改的代码开始更舒服


wait async.Go()
to
async.Go()代码将运行,但不会点击Console.WriteLine。

程序将在web请求完成之前结束。这是因为Main不会等待异步操作完成,因为它已经没有什么事情可做了

我打赌如果你让Main持续更长时间,那么
Console.WriteLine
将被调用


我会尝试在调用异步方法之后添加睡眠-
Thread.sleep(500)
-任何足够长的时间来允许web请求完成都应该有效。

程序在web请求完成之前结束。这是因为Main不会等待异步操作完成,因为它已经没有什么事情可做了

我打赌如果你让Main持续更长时间,那么
Console.WriteLine
将被调用


我会尝试在调用异步方法之后添加一个sleep-
线程。sleep(500)
-任何足够长的时间来允许web请求完成的操作都应该有效。

错误消息正确地告诉您,
wait
只能在
异步方法中使用。但是,您不能使
Main()
async
,C#不支持这一点

但是
async
方法返回
Task
s,与.NET4.0以来TPL中使用的
Task
相同。而且
Task
s确实支持使用同步等待。因此,您可以这样编写代码:

class Program
{
    static void Main(string[] args)
    {
        TestAsync async = new TestAsync();
        async.Go().Wait();
    }
}

在这里使用
Wait()
是正确的解决方案,但在其他情况下,混合使用
Wait()
的同步等待和使用
Wait
的异步等待可能是危险的,并可能导致死锁(特别是在GUI应用程序或ASP.NET中).

错误消息正确地告诉您,
wait
只能在
异步方法中使用。但是,您不能使
Main()
async
,C#不支持这一点

但是
async
方法返回
Task
s,与.NET4.0以来TPL中使用的
Task
相同。而且
Task
s确实支持使用同步等待。因此,您可以这样编写代码:

class Program
{
    static void Main(string[] args)
    {
        TestAsync async = new TestAsync();
        async.Go().Wait();
    }
}


在这里使用
Wait()
是正确的解决方案,但在其他情况下,将使用
Wait()
的同步等待与使用
Wait
的异步等待混合使用可能是危险的,并可能导致死锁(特别是在GUI应用程序或ASP.NET中)。

Main()
中直接使用Wait没有任何意义。您希望它做什么?我希望异步执行web调用。这个函数是任意的,我只想设置一个基本的异步调用来学习语法的基本知识。您可以随意以任何合适的方式进行web调用。在.net中学习异步的绝佳资源:顺便说一句,
使用
WebClient
中是不必要的。大多数情况下,您应该确保实现了IDisposable的任何东西都
Dispose()
,但是
WebClient
只有在它的基础(
Component
)中才有它。在
Main()
中直接使用wait没有任何意义。您希望它做什么?我希望异步执行web调用。这个函数是任意的,我只想设置一个基本的异步调用来学习语法的基本知识。您可以随意以任何合适的方式进行web调用。在.net中学习异步的绝佳资源:顺便说一句,
使用
WebClient
中是不必要的。大多数情况下,您应该确保实现了IDisposable的任何东西都
Dispose()
,但是
WebClient
拥有它只是因为它的基础(
组件
)有。这是一个合理的答案。但是,我希望异步框架提供一种阻塞机制。等待对我来说就像一个障碍…如果有时需要更长的时间怎么办?下载一些文件可能需要几个小时,这是否意味着我也要等几个小时才能下载一些小文件?如果下载失败并引发异常,会发生什么?同意,thread.sleep是同步线程的一种糟糕方法。对我的代码来说还不错,因为它是一次性的。我提供这个答案只是为了解释为什么他没有看到
控制台。WriteLine
,并提供一个简单的解决方案。我绝对不相信
Thread.Sleep
应该用于同步线程,但它完全可以帮助您学习新的异步功能,而不必像
Wait()
那样强制执行完整的块。这是一个合理的答案。但是,我希望异步框架提供一种阻塞机制。等待对我来说就像一个障碍…如果有时需要更长的时间怎么办?下载一些文件可能需要几个小时,这是否意味着我也要等几个小时才能下载一些小文件?如果下载失败并引发异常,会发生什么?同意,thread.sleep是同步线程的一种糟糕方法。对我的代码来说还不错,因为它是一次性的。我提供这个答案只是为了解释为什么他没有看到
控制台。WriteLine
,并提供一个简单的解决方案。我绝对不相信
Thread.Sleep
应该用于同步线程,但它完全可以帮助您学习新的异步功能,而不必像
Wait()
那样强制执行完整的块。我明白了,所以我使用控制台应用程序这一事实