I'm trying to combine my PLINQ statement like this:
Enumerable.Range(0, _sortedList.Count()).AsParallel().WithDegreeOfParallelism(10)
.Select(i => GetTransactionDetails(_sortedList[i].TransactionID))
.ToList();
With an async method like this:
private async void GetTransactionDetails(string _trID)
{
await Task.Run(() =>
{
});
}
So that I can simply add an await operator in here:
Enumerable.Range(0, _sortedList.Count()).AsParallel().WithDegreeOfParallelism(10)
.Select(i => await GetTransactionDetails(_sortedList[i].TransactionID))
.ToList();
How can I achieve this ?
P.S. This way I could make 5-10 HTTP requests simultaneously while ensuring that the end user doesn't feels any "screen" freezing while doing so...
There's a couple approaches you can take.
First, the "more correct" approach (which is also more work). Make
GetTransactionDetails
into a properasync
method (i.e., does not useTask.Run
):Then you can call that method concurrently:
If you need to limit concurrency, use a
SemaphoreSlim
.The second approach is more wasteful (in terms of thread usage), but is probably easier given what parts of your code we've seen. The second approach is to leave the I/O all synchronous and just do it in a regular PLINQ fashion:
To avoid blocking the UI thread, you can wrap this in a single
Task.Run
: