相关疑难解决方法(0)

无法在控制台应用程序的"Main"方法上指定"async"修饰符

我是使用async修饰符进行异步编程的新手.我试图弄清楚如何确保我Main的控制台应用程序的方法实际上异步运行.

class Program
{
    static void Main(string[] args)
    {
        Bootstrapper bs = new Bootstrapper();
        var list = bs.GetList();
    }
}

public class Bootstrapper {

    public async Task<List<TvChannel>> GetList()
    {
        GetPrograms pro = new GetPrograms();

        return await pro.DownloadTvChannels();
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这不是从"顶部"异步运行的.由于无法asyncMain方法上指定修饰符,如何在main异步中运行代码?

.net c# asynchronous console-application

415
推荐指数
10
解决办法
18万
查看次数

为什么控制台窗口会在显示输出后立即关闭?

我正在按照MSDN中的指南学习C#.

现在,我刚刚尝试了示例1(这里MSDN的链接),我遇到了一个问题:为什么控制台窗口会在显示输出后立即关闭?

using System;

public class Hello1
{
    public static int Main()
    {
        Console.WriteLine("Hello, World!");
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# msdn console-application

151
推荐指数
7
解决办法
31万
查看次数

了解在一行中使用的Task.Run + Wait()+ async + await的使用

我是C#新手,所以我很难理解一些概念,而且我遇到了一段我不太了解的代码:

static void Main(string[] args)
{
 Task.Run(async () => { await SomeClass.Initiate(new Configuration()); }).Wait();
 while (true) ;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这运行一个启动方法的任务.此方法运行,然后,一旦完成,它将进入无限循环等待.感觉代码没有意义,或者我不理解正确.

谢谢

c# async-await

10
推荐指数
2
解决办法
2万
查看次数

异步 - 留在当前线程?

我读过埃里克利珀的文章有关async,而约困惑的人曾与async关键字.他说 :

it(async)表示"此方法包含涉及等待异步操作的控制流,因此将由编译器重写为连续传递样式,以确保异步操作可以在正确的位置恢复此方法." 异步方法的全部意义你尽可能地留在当前的线程上

我不明白这一点.如果我执行一个异步方法(Task)并且它运行,它肯定会在另一个线程上运行.

此外,如果我写的方法使用await,(IMHO)它释放正常的控制流,和代码重构 相似" ContinueWith"后,在另一个线程.

我用(控制台)测试了它:

/*1*/   public void StartChain()
/*2*/   {
/*3*/           var a = FuncA();
/*4*/           Console.WriteLine(a.Result);
/*5*/   }
/*6*/   
/*7*/   public async Task < int > FuncA()
/*8*/   {
/*9*/           Console.WriteLine("A--" + Thread.CurrentThread.ManagedThreadId);
/*10*/           var t = await FuncB();
/*11*/           Console.WriteLine("B--" + Thread.CurrentThread.ManagedThreadId);
/*12*/           return t;
/*13*/   }
/*14*/   
/*15*/   public async Task < int > …
Run Code Online (Sandbox Code Playgroud)

async-await c#-5.0 .net-4.5

8
推荐指数
3
解决办法
4109
查看次数

我可以在 C# 中使用 async/await 内联吗

我有代码,它异步运行一些块。如何在不创建 LongTask() 和 LongOperationAsync() 函数的情况下使 LongOperation() 以“内联”方式(直接从 Main 方法)异步运行?

class Program
{
    static void Main(string[] args)
    {
        LongOperationAsync();
        Console.WriteLine("Main thread finished.");
        Console.ReadKey();     
    }

    static void LongOperation()
    {
        Thread.Sleep(3000);
        Console.WriteLine("Work completed");
    }

    static Task LongTask()
    {
        return Task.Run(() => LongOperation());
    }

    static async void LongOperationAsync()
    {
        await LongTask();
        Console.WriteLine("Callback triggered");
    }

}
Run Code Online (Sandbox Code Playgroud)

UPD

我希望我做对了。我的意思是,我想让任何现有函数异步并在执行后添加一些操作而不添加任何新函数。似乎下面的解决方案正在起作用。

class Program
{

    static void Main(string[] args)
    {

        ((Action)(async () =>
        {
            await Task.Run(() => LongOperation());
            Console.WriteLine("Then callback triggered");
        }))();

        Console.WriteLine("Main thread finished first.");


        Console.ReadKey();

    }

    static …
Run Code Online (Sandbox Code Playgroud)

c#

7
推荐指数
1
解决办法
4855
查看次数

等待和僵局预防 - 澄清?

我读了这篇文章,了解Task.ConfigureAwait哪些可以帮助防止异步代码中的死锁.

看看这段代码:( 我知道我不应该这样做.Result,但这是问题的一部分)

private void Button_Click(object sender, RoutedEventArgs e)
{
    string result = GetPageStatus().Result;
    Textbox.Text = result;
}
public async Task<string> GetPageStatus()
{
    using (var httpClient = new HttpClient())
    {
        var response = await httpClient.GetAsync("http://www.google.com");
        return response.StatusCode.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将导致死锁,因为:

  1. 然后.Result- 操作将在等待异步操作完成时阻止当前线程(即UI线程).

  2. 一旦网络调用完成,它将尝试继续response.StatusCode.ToString()在捕获的上下文上执行- 方法.(被封锁 - 因此死锁).

一种解决方案是使用:

var response = await httpClient.GetAsync("http://www.google.com").ConfigureAwait(false);

但其他解决方案是一直异步(没有阻塞):

/*1*/   private async void Button_Click(object sender, RoutedEventArgs e)
/*2*/   {
/*3*/       string result = await GetPageStatus(); …
Run Code Online (Sandbox Code Playgroud)

.net c# task-parallel-library async-await

6
推荐指数
1
解决办法
334
查看次数

使用.NET核心的异步请求

我需要一些帮助来找出问题所在.我已经使用了ASP.NET核心,我对此非常熟悉,尽管.NET核心C#似乎在"崩溃"并且在尝试发出异步请求时退出.

我有一个返回系统外部IP的方法

private async Task<string> getExternalIP()
    {
        using (System.Net.Http.HttpClient HC = new System.Net.Http.HttpClient())
        {
            return await HC.GetStringAsync("https://api.ipify.org/");
        }

    }
Run Code Online (Sandbox Code Playgroud)

这应该可以工作,但是当它到达HC.GetStringAsync时会退出.我也试过在它上面设一个断点,但它实际上并没有运行.

我试图通过使用调用该方法

string Address = await getExternalIP();
Run Code Online (Sandbox Code Playgroud)

任何帮助都很感激,希望我不只是忽略了一些东西.

谢谢!

.net c# console-application dotnet-httpclient .net-core

6
推荐指数
1
解决办法
1万
查看次数

async/await在控制台应用程序中不起作用

我对TPL完全是绿色的,并希望在控制台应用程序中执行异步方法.

我的代码:

    static void Main()
    {
        Task<string> t = MainAsync();
        t.Wait();
        Console.ReadLine();
    }

    static async Task<string> MainAsync()
    {
        var result = await (new Task<string>(() => { return "Test"; }));
        return result;

    }
Run Code Online (Sandbox Code Playgroud)

此任务永远运行.为什么?我错过了什么?

c# task-parallel-library async-await

2
推荐指数
1
解决办法
874
查看次数

异步 - 等待在我的程序中并行运行两个独立任务的必要条件吗?

我将尝试用你在下面看到的毫无意义的例子来说明我的问题.

using System;
using System.IO;
namespace PointlessProgram
{
    class PointlessClass 
    {
        public static void WriteFooToTextFile ( )
        {
            using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\Hillary\Documents\PointlessFolder\Foo.txt"))
            {
                file.Write("Foo");
            }
        }

        public static void WriteBarToTextFile ( )
        {
            using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\Hillary\Documents\PointlessFolder\Bar.txt")) 
            {
                file.Write("Bar");
            }    
        }

        static void Main() 
        {
           WriteFooToTextFile(); // (A)
           WriteBarToTextFile(); // (B)    
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,(B)不需要运行,(A)因为它不依赖于产生的任何输出(A),并且更好(A)依赖于(B).假设我的计算机有2个处理器,并且会将所有处理能力用于运行该程序.编译器是否会找出(A)并且(B)可以并行运行,或者它会一个接一个地运行它们除非我明确地编写我的代码以告诉机器(A)在开始执行之前不等待完成(B)?如果是这样,是async- await …

.net c# parallel-processing asynchronous async-await

2
推荐指数
1
解决办法
477
查看次数

如何在Main中正确调用Await方法?

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskConsole
{
    class Program
    {
        static void Main(string[] args)
        {       
             test();    
        }

        static async Task<string> ReadTextAsync() 
        {
            string textContents;
            Task<string> readFromText;

            using (StreamReader reader =  File.OpenText("email.txt"))
            {
                readFromText = reader.ReadToEndAsync();
                textContents = await readFromText;

            }

            return textContents;     
        }

        static async Task test ()
        {
            string capture = await ReadTextAsync();
            Console.WriteLine(capture);
        }               
    }               
}
Run Code Online (Sandbox Code Playgroud)

我有以下代码使用async从文本文件中读取.我从这篇文章中了解到,微软使用StreamReader实现的例子不正确,所以作为一个学习练习,我决定纠正它.当测试方法不返回任何任务时,如何从main正确调用测试方法.我做了一点阅读,并了解到使用async void是不好的做法.在我的情况下,我该怎么办?

旁注:我不知道我是否实施错误,但我无法显示我的文字.我尝试了非异步方式,但是,当我使用async时,它显示为空白,请按任意键继续"

c# asynchronous async-await

1
推荐指数
1
解决办法
126
查看次数