संपादितएसिंक्रोनस रूप से और समांतर फ़ाइलें डाउनलोड
मैं प्रश्न के शीर्षक मैं था मुद्दा लेकिन यह भी कितनी आसानी से इस लक्ष्य को हासिल करने के लिए पर एक जवाब प्रतिबिंबित करने के लिए बदल दिया है।
मैं Task<TResult>
बजाय Task
1 विधि में के रूप में वापस जाने के लिए 2 विधि बनाने के लिए कोशिश कर रहा हूँ लेकिन मैं इसे ठीक करने की कोशिश का एक परिणाम के रूप में त्रुटियों की एक झरना मिल रहा है।
- मैं
await body(partition.Current);
- से पहले
return
जोड़ा बारी में यह मुझे पूछता है तो मैं नीचे return null
जोड़ा नीचे एक वापसी कथन को जोड़ने के लिए लेकिन अब चुनिंदा बयान शिकायत है कि यह क्वेरी से प्रकार तर्क अनुमान नहीं लगा सकता
- मैं
Task.Run
सेTask.Run<TResult>
बदलता हूं लेकिन सफलता के बिना।
मैं इसे कैसे ठीक कर सकता हूं?
पहली विधि http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx से आता है, दूसरी विधि अधिभार है जिसे मैं बनाने की कोशिश कर रहा हूं।
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);
}));
}
}
प्रयोग उदाहरण:
इस पद्धति सेमैं समानांतर और एसिंक्रोनस रूप में अनेक फ़ाइलों को डाउनलोड करना चाहते हैं:
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;
}
}
यह स्पष्ट नहीं है कि आप परिणाम की अपेक्षा करेंगे। आप 'T' मूल्यों की एक पूरी अनुक्रम में गुजर रहे हैं, और उन दोनों पर एक ही फ़ंक्शन को निष्पादित - क्या एकल परिणाम आप की' टास्क 'लौटे बाहर निकलने के लिए उम्मीद करेंगे? –
मुझे लगता है कि मामले में एक टास्क प्राप्त करना चाहते हैं, मैं अपने प्रश्न पर एक उदाहरण जोड़ दिया है। –
Aybe
* * "इस विधि के साथ मैं समानांतर में एक से अधिक फ़ाइलों को डाउनलोड करने और अतुल्यकालिक रूप से करना चाहते हैं": 'Parallel.Foreach' पर्याप्त नहीं है? –