相关疑难解决方法(0)

如何将大型foreach循环分解为批处理并同时处理它?

foreach (var deviceId in deviceList)
{
    // register device into IoT hub 
    Device device;
    RegistryManager registryManager = RegistryManager.CreateFromConnectionString("connectionString");
    device = await registryManager.AddDeviceAsync(new Device(deviceId));

    // send message to iot hub
    DeviceClient deviceClient;
    await deviceClient.SendEventAsync("data");                       
}
Run Code Online (Sandbox Code Playgroud)

如果设备是10000,那我怎么能把它分成多个批处理并处理呢?

我试过这个代码,但它并没有让人失望

public IEnumerable<user> GetBatch(int pageNumber)
{
    return users.Skip(pageNumber * 1000).Take(1000);
}
Run Code Online (Sandbox Code Playgroud)

c# foreach loops batch-processing c#-4.0

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

在 Parallel.ForEach 循环内进行数据库调用异步会提高性能吗?

使用 Parallel.ForEach 时,将任何 DB 或 Api 调用转换为异步方法是否会提高性能?

一些背景知识,我目前有一个控制台应用程序,它按顺序循环访问一堆文件,并为每个文件调用一个 API 并进行一些数据库调用。主要逻辑如下:

foreach (file in files)
{
    ReadTheFileAndComputeAFewThings(file);
    CallAWebService(file);
    MakeAFewDbCalls(file);
}
Run Code Online (Sandbox Code Playgroud)

目前,所有数据库和 Web 服务调用都是同步的。

Parallel.ForEach正如您所期望的那样,更改要使用的循环给我带来了巨大的性能提升。

我想知道是否将调用保留Parallel.ForEach在那里,并在循环内将所有 Web 服务调用更改为异步(例如,HttpClient.SendAsync)并将 DB 调用更改为异步(使用 Dapper,db.ExecuteAsync()) - 这是否会通过允许它来提高应用程序的性能重用线程?或者它实际上什么都不做,因为Parallel.ForEach无论如何都会处理线程分配?

c# parallel-processing httpclient task dapper

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

如何等待并行Linq操作完成

我不确定我应该如何混合plinq和async-await.假设我有以下界面

public interface IDoSomething (
    Task Do();
}
Run Code Online (Sandbox Code Playgroud)

我有一个列表,我想并行执行,并能够await完成所有这些.

public async Task DoAll(IDoSomething[] doers) {
    //Execute all doers in parallel ideally using plinq and 
    //continue when all are complete
}
Run Code Online (Sandbox Code Playgroud)

怎么实现这个?我不知道如何从并行linq转到任务,反之亦然.

我对异常处理并不十分担心.理想情况下,第一个会触发并打破整个过程,因为我打算在出错时抛弃整个过程.

编辑:很多人都说Task.WaitAll.我知道这一点,但我的理解(除非有人能证明不是这样)是因为它不能主动将你的东西并行化到多个可用的处理器核心.我特别要问的是双重的 -

  1. 如果我await一个Task一个PLINQ行动中确实是摆脱由于日程安排一个新的线程有很多的优势的?

  2. 如果我doers.AsParallel().ForAll(async d => await d.Do())平均需要大约5秒钟,那么在此期间我怎么不旋转调用线程呢?

c# linq parallel-extensions task-parallel-library async-await

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

无法从'System.Threading.Tasks.Task'转换为'System.Collections.Generic.Dictionary <string,string>'

我相信我可能只是语法错误,但我想要做的是创建一个在另一个任务完成后运行的任务.

我在列表中为每个100的数组创建了一个任务.它启动一个新线程将该数组传递给一个方法.该方法在完成时返回字典.我正在尝试创建一个在方法完成后运行的任务,它将返回的字典传递给另一个执行更多工作的方法.

static void Main(string[] args)
    {
        try
        {
            stopwatch = new Stopwatch();
            stopwatch.Start();
            while (true)
            {
                startDownload();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

public static async void startDownload()
    {
        try
        {

            DateTime currentDay = DateTime.Now;

            if (Helper.holidays.Contains(currentDay) == false)
            {
                List<string> markets = new List<string>() { "amex", "global", "nasdaq", "nyse" };

                Parallel.ForEach(markets, async market =>
                {
                    try
                    {

                        IEnumerable<string> symbolList = Helper.getStockSymbols(market);
                        var historicalGroups = symbolList.Select((x, i) => new { x, i })
                          .GroupBy(x => x.i …
Run Code Online (Sandbox Code Playgroud)

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

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

在Select linq查询中使用async/await

阅读本文后: 在Parallel.ForEach中嵌套等待

我试着做以下事情:

private static async void Solution3UsingLinq()
{
    var ids = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };

    var customerTasks = ids.Select(async i =>
    {
        ICustomerRepo repo = new CustomerRepo();
        var id = await repo.getCustomer(i);
        Console.WriteLine(id);

    });
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这不起作用......我不明白为什么,我认为有一个僵局,但我不确定......

c# linq select asynchronous async-await

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

自定义实现的 ForEachParallelAsync 在调用异步方法时切换线程

我有一个 WPF 应用程序,它使用自定义实现的 ForEachAsyncParallel 方法:

public static Task ForEachParallelAsync<T>(this IEnumerable<T> source, Func<T, Task> body, int maxDegreeOfParallelism)
{
      return Task.WhenAll(Partitioner.Create(source).GetPartitions(maxDegreeOfParallelism).Select(partition => Task.Run(async delegate
      {
           using (partition)
           {
               while (partition.MoveNext())
               {
                   await body(partition.Current);
               }
           }
      })));
}
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,当正文包含异步语句并在执行它时,它将线程切换到新线程,这会导致The calling thread cannot access this object because a different thread owns it.

另一种方法是使用 foreach 循环或调度程序(我不想这样做)是否可以指出当前实现的问题?

c# async-await

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

为什么异步Parallel.ForEach中的异常会使应用程序崩溃?

如果在控制台应用程序中运行而不是将其抛出AggregateException并被外部捕获,以下的崩溃为什么会崩溃try/catch

I've simplified the use case for the await for brevity, but in the relevant code I am indeed trying to execute an awaitable Task of importance.

var list = new List<string>() {"Error"};

        try
        {
            Parallel.ForEach(list, new ParallelOptions()
            {
                MaxDegreeOfParallelism = 8
            }, async listEntry =>
            {
                await Task.Delay(5000);
                throw new Exception("Exception");
            });
        }
        catch (Exception ex)
        {
            //never hits, the application crashes
        }

        Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

I note that the following does not cause the application to …

c# exception task-parallel-library parallel.foreach

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