J'ai écrit une méthode qui télécharge des fichiers, et maintenant j'essaie de le faire télécharger jusqu'à 5 fichiers en parallèle, et pour le reste d'attendre que les précédents se terminent. J'utilise un ManualResetEvent pour cela, mais quand j'inclus la partie de syncronisation, il ne télécharge plus rien (sans que cela fonctionne).Problème de synchronisation avec ManualResetEvent
Voici le code des méthodes:
static readonly int maxFiles = 5;
static int files = 0;
static object filesLocker = new object();
static System.Threading.ManualResetEvent sync = new System.Threading.ManualResetEvent(true);
/// <summary>
/// Download a file from wikipedia asynchronously
/// </summary>
/// <param name="filename"></param>
public void DoanloadFileAsync(string filename)
{
...
System.Threading.ThreadPool.QueueUserWorkItem(
(o) =>
{
bool loop = true;
while (loop)
if (sync.WaitOne())
lock (filesLocker)
{
if (files < maxFiles)
{
++files;
if (files == maxFiles)
sync.Reset();
loop = false;
}
}
try
{
WebClient downloadClient = new WebClient();
downloadClient.OpenReadCompleted += new OpenReadCompletedEventHandler(downloadClient_OpenReadCompleted);
downloadClient.OpenReadAsync(new Uri(url, UriKind.Absolute));
//5 of them do get here
}
catch
{
lock (filesLocker)
{
--files;
sync.Set();
}
throw;
}
});
}
void downloadClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
try
{
//but none of the 5 get here
...Download logic... //works without the ManualResetEvent
}
finally
{
lock (filesLocker)
{
--files;
sync.Set();
}
}
}
que je fais quelque chose de mal?
Il est écrit avec Silverlight 4 pour Windows Phone 7.
Edit: Il n'y a pas Sémaphore ou SemaphoreSlim dans Silverlight 4.
Pourquoi verrouillage lorsque vous pouvez utiliser la méthode 'System.Threading.Interlocked.Decrement()', etc.? –
Parce que je veux aussi appeler sync.Set(), et je pense que quelqu'un appelle froid sync.Set() à partir d'un autre thread, puis je décrémente, certains threads incrémentent et appellent sync.Reset(), puis j'appelle sync.Set () et j'obtiens plus de téléchargements de threads maxFiles. – user182945
Vérifie ma réponse, c'est ce que tu cherches. Aussi, en utilisant un événement de réinitialisation est OK, je ne vois tout simplement pas le besoin de verrous. Oh, j'utilise AutoResetEvent, car c'est exactement ce dont vous avez besoin ici. –