Я пишу приложение, которое выполняет очень длинные запросы на фоне. После каждого запроса мне нужно отправить результат в основную форму.Выполнение действия <> в основной теме
Итак, вот код:
Form1.cs
private async void StartButton_Click(object sender, EventArgs e)
{
await Logic.GenerateStackAsync(stackSettings, delegate(FullOrder transaction)
{
lastOrderId.Text = transaction.OrderId;
}
);
MessageBox.Show("Completed!");
}
Logic.cs:
public static bool GenerateStack(StackSettings stackSettings, Action<FullOrder> onOrderCreated = null)
{
for(var i = 0; i < 10; i++)
{
// long, long request, replaced with:
System.Threading.Thread.Sleep(10000);
if (onOrderCreated != null)
{
onOrderCreated.Invoke(order);
// tried to change it with onOrderCreated(order), no results.
}
}
return true;
}
public static Task<bool> GenerateStackAsync(StackSettings stackSettings, Action<FullOrder> onOrderCreated)
{
return TaskEx.Run(() => GenerateStack(stackSettings, onOrderCreated));
}
Он бросает исключение: «Control 'lastOrderId' доступ из потока кроме потока, на котором он был создан. », который можно исправить добавлением CheckForIllegalCrossThreadCalls = false;
, но я думаю, что это плохой опыт. Как все исправить? Заранее спасибо.
P.S. Извините за плохой английский.
проверить это: http://stackoverflow.com/a/1136406/1873002 –
Этот пример кода делает именно то, что вы пытаетесь do: http://stackoverflow.com/a/21357567/1768303 – Noseratio