Я пытаюсь создать настольное приложение, которое собирает данные для пользователя и загружает их.Ранее я использовал довольно плохую настройку, которая просто вызывала асинхронную загрузку, как только эти данные были найдены, но я хотел перейти к настройке производителя / потребителя, так как это действительно очистило большую часть моего кода и уменьшило объемПараметры метода мне пришлось обойти.
Я использую это в качестве примера, чтобы выйти из (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);
}