我一直试图确定从异步任务中操作UI的正确方法。我的应用程序被线程调用和BeginInvokes弄得乱七八糟。我试图通过利用C#异步等待来缓解这种混乱,并在UI上提供更多的响应。
在UI线程的某个位置,我初始化IProgress事件处理程序并将其传递给一个名为DoInfiniteWorkAsync的异步函数。此函数在后台任务中无限地运行,但通常需要更新UI的部分内容。
private void Form1_Load(object sender, EventArgs e)
{
// Create a UIEventHandler on our UI thread.
Progress<string> UIEventHandler = new Progress<string>();
UIEventHandler.ProgressChanged += UIEventHandler_CommandRaised;
// Pass the UIEventHandler to our Asyncronous task.
DoInfiniteWorkAsync(UIEventHandler);
}
void UIEventHandler_EventRaised(object sender, string e)
{
string eventMessage = e;
// Update UI based on the event message.
}我的DoInfiniteWorkAsync函数在运行任务时使用传入的UIEventHandler来报告UIEventMessages。
private async Task DoInfiniteWorkAsync(IProgress<string> UIEventHandler)
{
await Task.Run(() =>
{
// 24/7 running tasks.
// Sets a UIEventMessage to signal UI thread to do something.
UIEventHandler.Report(UIEventMessage);
});
}这是从长期运行的后台线程更新UI线程的正确方式吗?我的事件处理程序数据类型(IProgress)专门针对进度报告这一事实让我觉得自己没有抓住重点。
发布于 2018-09-28 02:48:17
要将数据从一个异步线程导入到另一个异步线程,您必须调用它。
在您的类中定义一个属性字段:
string _readData = null;然后用eventMessage填充字符串,并调用一个方法来调用数据。
string eventMessage = e;
_readData = eventMessage;
Msg();这是Msg()方法:
private void Msg()
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(Msg));
}
else
{
textBox2.Text = textBox2.Text + Environment.NewLine + " >> " + _readData;
}
}https://stackoverflow.com/questions/52546580
复制相似问题