C # Producer / Consumer setup, Consumer никогда не работает, если есть пользовательский интерфейс? - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь создать настольное приложение, которое собирает данные для пользователя и загружает их.Ранее я использовал довольно плохую настройку, которая просто вызывала асинхронную загрузку, как только эти данные были найдены, но я хотел перейти к настройке производителя / потребителя, так как это действительно очистило большую часть моего кода и уменьшило объемПараметры метода мне пришлось обойти.

Я использую это в качестве примера, чтобы выйти из (https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-implement-a-producer-consumer-dataflow-pattern)), и это отлично работает. Но у моего приложения также есть пользовательский интерфейс. Это не тот пользовательский интерфейс, который долженработать в то время как программа делает свое дело, пользовательский интерфейс в основном просто устанавливает аргументы. Я рад за его блокировку. Это должно быть. Но когда я перемещаю элементы (из этой ссылки), как установка буфера ипотребитель.Wait () в метод, который вызывается при нажатии кнопки из пользовательского интерфейса (Запуск программы), потребитель никогда не действует.

Через ведение журнала и использование только слегка измененной версии по этой ссылке,производитель выдаст то, что я ожидаю, без проблем. Но он никогда не пройдет мимо потребителя. Wait (). Он просто будет сидеть там. В частности, он никогда не пройдет мимо "while (ожидайте source.OutputAvailableAsync ()) {Msgstr "Это просто застревает навсегда в ожидании, в то время как я могу гарантировать, что элементы были правильно отправлены через цель. Post ().

У меня есть предположение, что это может быть связано с, возможно, не хватает тдоступны ли ноты или что?Как потребитель просто голодает?Я не уверен.Все, что мне удалось найти, - это люди, которым нужны интерактивные пользовательские интерфейсы, чего я определенно не хочу.Но похоже, что мой пользовательский интерфейс и потребитель конкурируют.Если я удаляю окно из основного метода и просто помещаю основной класс из этой документации Microsoft, у него вообще не возникает проблем.Я просто заблудился относительно того, как пройти.

Редактировать: Мой код, хотя и очень грязный, когда я пытаюсь это выяснить, прежде чем переключить его обратно на долгосрочное решение.

private static void Produce(ITargetBlock<KeyValuePair<string, string>> target)
{

    // In a loop, fill a buffer with random data and
    // post the buffer to the target block.
    for (var i = 0; i < 100; i++)
    {
        // Create an array to hold random byte data.
        var buffer = new KeyValuePair<string, string>(DateTime.Now.ToString("yyyy-M-d") + " profile",
            "http://www.orseu-concours.com/451-615-thickbox/selor-test-de-raisonnement-abstrait-niveau-a.jpg");

        // Post the result to the message block.
        target.Post(buffer);
        Console.WriteLine(buffer);
    }

    // Set the target to the completed state to signal to the consumer
    // that no more data will be available.
    target.Complete();
}

// Demonstrates the consumption end of the producer and consumer pattern.
private static async Task<int> ConsumeAsync(ISourceBlock<KeyValuePair<string, string>> source)
{
    // Initialize a counter to track the number of bytes that are processed.
    var line = 0;

    // Read from the source buffer until the source buffer has no 
    // available output data.
    while (await source.OutputAvailableAsync())
    {
        var data = source.Receive();
        Console.WriteLine(line + " Data received: " + data);
        line++;

        // Increment the count of bytes received.
        // bytesProcessed += data.Length;
    }

    return line;
}

public static void SetUp(string targetAccount, bool headless, bool firefoxProfile)
{

    var buffer = new BufferBlock<KeyValuePair<string, string>>();
    Console.WriteLine("Buffer block creation has no issues");

    // Start the consumer. The Consume method runs asynchronously. 
    var consumer = ConsumeAsync(buffer);
    Console.WriteLine("Creating consumer has no issues");

    // Post source data to the dataflow block.
    Produce(buffer);
    Console.WriteLine("Running producer has no issues");

    // Wait for the consumer to process all data.
    consumer.Wait();
    Console.WriteLine("Waiting for consumer to finish has no issues");

    // Print the count of bytes processed to the console.
    Console.WriteLine("Processed {0} bytes.", consumer.Result);
}

1 Ответ

0 голосов
/ 01 января 2019

В этом примере используется консольное приложение.Они используют .wait, чтобы убедиться, что консольное приложение не закрывается, но в вашем случае вам, вероятно, следует дождаться его, потому что .wait блокирует.Но, пожалуйста, поделитесь своим реальным кодом.Как вы можете себе представить, нам довольно сложно сказать, что происходит, если вы не публикуете свой код

В случае, если кто-то еще застрял, как я, изменив «Потребитель.() «ждать потребителя», как подсказал @PeterBons.В моем случае это все еще немного странно, но полная функциональность работает, чуть больше за кадром, чем я ожидал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...