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) 使用 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
无论如何都会处理线程分配?
我不确定我应该如何混合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
.我知道这一点,但我的理解(除非有人能证明不是这样)是因为它不能主动将你的东西并行化到多个可用的处理器核心.我特别要问的是双重的 -
如果我await
一个Task
一个PLINQ行动中确实是摆脱由于日程安排一个新的线程有很多的优势的?
如果我doers.AsParallel().ForAll(async d => await d.Do())
平均需要大约5秒钟,那么在此期间我怎么不旋转调用线程呢?
c# linq parallel-extensions task-parallel-library async-await
我相信我可能只是语法错误,但我想要做的是创建一个在另一个任务完成后运行的任务.
我在列表中为每个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) 阅读本文后: 在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)
出于某种原因,这不起作用......我不明白为什么,我认为有一个僵局,但我不确定......
我有一个 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 循环或调度程序(我不想这样做)是否可以指出当前实现的问题?
如果在控制台应用程序中运行而不是将其抛出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# ×7
async-await ×4
linq ×2
.net ×1
asynchronous ×1
c#-4.0 ×1
dapper ×1
exception ×1
foreach ×1
httpclient ×1
loops ×1
select ×1
task ×1