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# 正在同步运行的任务_C#_Asynchronous_Async Await - Fatal编程技术网

C# 正在同步运行的任务

C# 正在同步运行的任务,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我目前正在尝试学习C#中的async await,遇到了以下问题: 我正在构建一个服务器应用程序,它从数据库中获取数据,并根据获得的数据运行计算。我当前的示例是获取两个日期,然后从不同的表中获取数据 因为我正在访问大量数据(每个表大约10.000.000个条目),所以我希望通过使用async await在多个线程上每月运行(给定的时间范围通常为一年)来加快速度 所讨论的代码如下所示: public async Task foo() { var tasks = new List<T

我目前正在尝试学习C#中的async await,遇到了以下问题:

我正在构建一个服务器应用程序,它从数据库中获取数据,并根据获得的数据运行计算。我当前的示例是获取两个日期,然后从不同的表中获取数据

因为我正在访问大量数据(每个表大约10.000.000个条目),所以我希望通过使用async await在多个线程上每月运行(给定的时间范围通常为一年)来加快速度

所讨论的代码如下所示:

public async Task foo() {

    var tasks = new List<Task>();

    for(int month = 0; i < 12; i++) {
        task.Add(this.RunJob(month));
    }

     await Task.WhenAll(tasks);
}

private async Task RunJob(int month) {

    Console.WriteLine($"starting month {month}");

    //big calculation

    Console.WriteLine($"stopping month {month}");
}

公共异步任务foo(){
var tasks=新列表();
对于(整数月=0;i<12;i++){
task.Add(this.RunJob(月));
}
等待任务。何时(任务);
}
专用异步任务运行作业(整月){
Console.WriteLine($“起始月{month}”);
//大算盘
Console.WriteLine($“停止月份{month}”);
}
但代码似乎运行synchron,因为控制台最终显示

starting month 0 stopping month 0 starting month 1 stopping month 1 ... starting month 11 stopping month 11 第0个月开始 停止第0个月 第一个月开始 第1个月停止 ... 第11个月开始 第11个月停止
就我所知,代码应该在多个线程上运行,我目前看不出我犯了什么错误。

您必须将RunJob方法更改为:

    private async Task RunJob(int month) {
        return await Task.Run(() =>
        {
            Console.WriteLine($"starting month {month}");


            //big calculation


            Console.WriteLine($"stopping month {month}");
        });
}

您还应该将其重命名为RunJobAsync您必须将RunJob方法更改为:

    private async Task RunJob(int month) {
        return await Task.Run(() =>
        {
            Console.WriteLine($"starting month {month}");


            //big calculation


            Console.WriteLine($"stopping month {month}");
        });
}

您还应该将其重命名为RunJobAsync

您在
RunJob()
中等待什么吗? 您必须在整个方法链中使用async/await

async Task Main()
{
    await foo();
}

public async Task foo() 
{
    var tasks = new List<Task>();

    for(int i = 0; i < 12; i++) 
    {
        tasks.Add(this.RunJob(i));
    }

    await Task.WhenAll(tasks);

}

private async Task RunJob(int month) 
{
    Console.WriteLine($"starting month {month}");

    // Simulating Long running process
    await Task.Delay(2000);

    Console.WriteLine($"stopping month {month}");

}

您是否正在等待
RunJob()
中的某些内容? 您必须在整个方法链中使用async/await

async Task Main()
{
    await foo();
}

public async Task foo() 
{
    var tasks = new List<Task>();

    for(int i = 0; i < 12; i++) 
    {
        tasks.Add(this.RunJob(i));
    }

    await Task.WhenAll(tasks);

}

private async Task RunJob(int month) 
{
    Console.WriteLine($"starting month {month}");

    // Simulating Long running process
    await Task.Delay(2000);

    Console.WriteLine($"stopping month {month}");

}


那么,在
RunJob
中是否有异步代码?你能举一个这样一段异步代码的例子吗?您是否会收到类似“此异步方法缺少'await'运算符并将同步运行”的警告?正如您所知,将关键字
async
添加到方法上并不会神奇地使其在不同的线程上运行。这意味着编译器将允许您在内部使用
await
关键字,并且该方法将被重写为处理任务与其余代码之间交互的状态机。首先要记住的是,异步await不适用于在多个线程上运行。Async Await用于更有效地使用单个线程,如果Async方法由于文件访问或网络访问而异步,则不一定创建新线程。@Nautha向我们展示了这些SQL调用的样子如果您处理的是CPU限制的计算,而不是I/O限制的操作,使用该方法而不是任务和
Task.whalll
可能更好。这样可以更好地利用CPU资源。那么,在
RunJob
中是否有异步代码?你能举一个这样一段异步代码的例子吗?您是否会收到类似“此异步方法缺少'await'运算符并将同步运行”的警告?正如您所知,将关键字
async
添加到方法上并不会神奇地使其在不同的线程上运行。这意味着编译器将允许您在内部使用
await
关键字,并且该方法将被重写为处理任务与其余代码之间交互的状态机。首先要记住的是,异步await不适用于在多个线程上运行。Async Await用于更有效地使用单个线程,如果Async方法由于文件访问或网络访问而异步,则不一定创建新线程。@Nautha向我们展示了这些SQL调用的样子如果您处理的是CPU限制的计算,而不是I/O限制的操作,使用该方法而不是任务和
Task.whalll
可能更好。通过这种方式,您可以更好地利用CPU资源。为什么要重命名方法?)这是您个人对命名的偏好这不是个人偏好,这是一种惯例,但我同意,它不必重新命名,现在许多人已经停止在名称中添加
Async
,因为如果返回类型是
Task
@colim,很明显每个开发人员/团队都会设置自己的约定。如果所有方法都返回
Task
,我看不出有什么理由添加
Async
后缀。@OlegI这是微软的惯例,几乎每个人都坚持这样做。争论命名约定是愚蠢的,因为这个答案是错误的,为什么方法应该被重命名?)这是你个人对命名的偏好这不是个人偏好,这是约定,但我同意,它不必重新命名,现在许多人已经停止在名称中添加
Async
,因为如果返回类型是
Task
@colim,很明显每个开发人员/团队都会设置自己的约定。如果所有方法都返回
Task
,我看不出有什么理由添加
Async
后缀。@OlegI这是微软的惯例,几乎每个人都坚持这样做。当这个答案在某种程度上对每种方法都是错误的时候,争论命名约定是愚蠢的?所以调用的所有方法都不能没有async Wait?是的,每个方法都可以,因为如果同步运行一个方法,该方法中的所有代码也将同步运行。如果我使用的包没有实现异步方法怎么办?还有什么方法可以异步运行这些方法吗?@Nautha如果方法没有等待任何东西,为什么要使用async/await?@Nautha看看每个方法的这个问题?所以调用的所有方法都不能没有async Wait?是的,每个方法都可以,因为如果同步运行一个方法,该方法中的所有代码也将同步运行。如果我使用的包没有实现异步方法怎么办?还有什么方法可以异步运行这些方法吗?@Nautha如果方法没有等待任何东西,为什么要使用async/await?@Nautha看看这个问题