كيفية أداء interlocared.increment/انخفاض بشكل صحيح في IO ملزمة؟

StackOverflow https://stackoverflow.com/questions/20353398

  •  25-08-2022
  •  | 
  •  

سؤال

لدي تطبيق وحدة تحكم IO Bound 4.0 بسيطة ، والذي يرسل طلبًا إلى 1 إلى خدمة ويب وانتظر إكمالها ثم الخروج. هنا عينة ،

static int counter = 0;
static void Main(string[] args)
{
foreach (my Loop)
{
    ......................
    WebClientHelper.PostDataAsync(... =>
    {

        ................................
        ................................
        Interlocked.Decrement(ref counter);
    });
    Interlocked.Increment(ref counter);
}
    while(counter != 0)
    {
    Thread.Sleep(500);
    }
}

هل هذا هو التنفيذ الصحيح؟

هل كانت مفيدة؟

المحلول 2

كما اقترح هانز ، إليك الكود الذي تم تنفيذه مع CountdownEvent:

static void Main(string[] args)
{
    var counter = new CountdownEvent();
    foreach (my Loop)
    {
        ......................
        WebClientHelper.PostDataAsync(... =>
        {

            ................................
            ................................
            counter.Signal();
        });
        counter.AddCount();
    }

    counter.Wait();
}

نصائح أخرى

يمكنك استخدام المهام. دع TPL تدير هذه الأشياء.

Task<T>[] tasks = ...;
//Started the tasks
Task.WaitAll(tasks);

طريقة أخرى هي الاستخدام TaskCompletionsource كما ذكر هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top