DÜZENLEMEuyumsuz ve paralel dosya indirme
ben vardı sorunu değil, aynı zamanda kolayca bunu başarmak için nasıl bir yanıt yansıtacak şekilde sorunun başlığını değiştirdik.
Ben 1 yönteminde olduğu gibi
Task<TResult>
yerine
Task
dönmek 2 yöntem yapmaya çalışıyorum ama bunu düzeltmeye çalışıyorum sonucunda hataların bir çağlayan alıyorum.
- Ben bu yüzden
- altına
return null
eklendi altında bir return ifadesi eklemek Ama şimdi select ifadesi o sorgusu gelen tür bağımsız değişkeni çıkaramayacağı anlamına şikayet etmemi istediği Buna karşılık
- önce
return
eklendi Task.Run
'uTask.Run<TResult>
olarak değiştirdim, ancak başarılı olmaksızın.
await body(partition.Current);
Nasıl düzeltebilirim?
İlk yöntem http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx'dan geliyor, ikinci yöntem oluşturmaya çalıştığım aşırı yüklenmedir.
public static class Extensions
{
public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate
{
using (partition)
while (partition.MoveNext())
await body(partition.Current);
}));
}
public static Task ForEachAsync<T, TResult>(this IEnumerable<T> source, int dop, Func<T, Task<TResult>> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate
{
using (partition)
while (partition.MoveNext())
await body(partition.Current);
}));
}
}
Kullanım örneği: Bu yöntemle
Ben uyumsuz paralel ve birden çok dosyayı indirmek istediğiniz: Ben ve burada göndermeden çözüldü
private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Artist artist = await GetArtist();
IEnumerable<string> enumerable = artist.Reviews.Select(s => s.ImageUrl);
string[] downloadFile = await DownloadFiles(enumerable);
}
public static async Task<string[]> DownloadFiles(IEnumerable<string> enumerable)
{
if (enumerable == null) throw new ArgumentNullException("enumerable");
await enumerable.ForEachAsync(5, s => DownloadFile(s));
// Incomplete, the above statement is void and can't be returned
}
public static async Task<string> DownloadFile(string address)
{
/* Download a file from specified address,
* return destination file name on success or null on failure */
if (address == null)
{
return null;
}
Uri result;
if (!Uri.TryCreate(address, UriKind.Absolute, out result))
{
Debug.WriteLine(string.Format("Couldn't create URI from specified address: {0}", address));
return null;
}
try
{
using (var client = new WebClient())
{
string fileName = Path.GetTempFileName();
await client.DownloadFileTaskAsync(address, fileName);
Debug.WriteLine(string.Format("Downloaded file saved to: {0} ({1})", fileName, address));
return fileName;
}
}
catch (WebException webException)
{
Debug.WriteLine(string.Format("Couldn't download file from specified address: {0}", webException.Message));
return null;
}
}
Sonuçların ne olacağını umduğunuz hiç de net değil. T 'değerlerinin bir dizisini geçiyorsunuz ve her ikisinde de aynı işlevi yerine getiriyorsunuz - Görev'dan ne tür bir sonuç elde etmeyi bekliyorsunuz? –
Bir Görev almak istiyorum, bu soruya bir örnek ekledim. –
Aybe
* "Bu yöntemle paralel ve senkronize olmayan birden fazla dosya indirmek istiyorum" *: 'Paralel.Foreach' yeterli değil mi? –