Каковы риски использования формы без запуска насоса сообщений для потока?C#

Место общения программистов C#
Anonymous
Каковы риски использования формы без запуска насоса сообщений для потока?

Сообщение Anonymous »

У меня есть сторонний элемент управления WinForms, который мне нужно использовать для визуализации и сохранения данных в виде изображений. На самом деле мне не нужно видеть форму на экране, мне просто нужно, чтобы она существовала. В настоящее время я просто создаю новый поток, устанавливаю для него значение STA, а затем создаю форму в потоке (и перемещаю форму за пределы экрана, потому что я не хочу ее видеть). Затем поток блокируется в цикле, где он иногда выбирает элементы для рендеринга из BlockingCollection
Согласно этому ответу я должен начать сообщение цикл, используя Application.Run(form) в этом потоке, и мне также не следует блокировать этот поток. Мой код нарушает оба этих принципа.
По результатам моего ограниченного тестирования я не вижу никаких проблем в своем подходе, но мне не хватает глубины понимания, чтобы предвидеть здесь потенциальные проблемы.
private static void ProcessQueue()
{
// This function gets passed in the Thread ctor

Debug.Assert(Thread.CurrentThread.GetApartmentState() == ApartmentState.STA);

var form = new Form()
{
ShowInTaskbar = false,
Height = 800,
Width = 800,
FormBorderStyle = FormBorderStyle.None,
MaximizeBox = false,
MinimizeBox = false,
Text = "Graphics helper window"
};

var display = new MyThirdPartyActiveXDisplay();
form.Controls.Add(display);
display.Dock = DockStyle.Fill;

form.Show();

form.Top = -2000;
form.Left = -2000;

while (!SaveQueue.IsCompleted)
{
var item = SaveQueue.Take();

var image = display.render(item.value)

item.SetResult(image); // This uses a TaskCompletionSource under the hood to pass the result to the caller that added the item to the queue
}
}

What potential risks should I look for with this approach? Why is it recommended to start a message pump and not block an STAThread?


Подробнее здесь: https://stackoverflow.com/questions/788 ... or-a-threa

Вернуться в «C#»