【发布时间】:2021-10-27 11:07:22
【问题描述】:
我对事件比较陌生,我试图了解为什么我的代码不能正常工作。我想在动作开始时触发一个事件,将标签文本设置为“开始”,当方法完成时,标签会说“完成”。到目前为止非常基本。两个事件都被触发了,但是在 StartEvent 中,UI-Label 没有被更新,尽管我在EventsClassOnStartedWorkEvent 设置了一个断点。该行正在执行,但标签没有被更改。我还在DoWork() 中尝试了更长的执行时间。循环完成后,FinishedWorkEvent 会正确更改 UI-Label。
我尝试过的:订阅 MainWindow 构造函数中的事件。
提前致谢。
using EventsNamespace;
using System;
namespace DLL
{
class EventsClass
{
public event TestEventEventHandler FinishedWorkEvent;
public event TestEventEventHandler StartedWorkEvent;
public void DoWork()
{
StartedWorkEvent(this,new UIEventArgs("started"));
for (int i = 0; i < 1000000000; i++)
{
int sum = 0;
}
FinishedWorkEvent(this, new UIEventArgs("Finished"));
}
}
}
namespace EventsNamespace
{
public delegate void TestEventEventHandler(object sender, UIEventArgs e);
public class UIEventArgs : EventArgs
{
public string Result { get; set; }
public UIEventArgs(string result)
{
Result = result;
}
}
using DLL;
using EventsNamespace;
using System.Windows;
namespace EventsTestUI
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private EventsClass eventsClass;
public MainWindow()
{
InitializeComponent();
eventsClass = new EventsClass();
}
private void EventsClassOnFinishedWorkEvent(object sender, UIEventArgs e)
{
ResultLabel.Content = e.Result;
}
private void EventsClassOnStartedWorkEvent(object sender, UIEventArgs e)
{
ResultLabel.Content = e.Result;
}
private void StartButton_Click(object sender, RoutedEventArgs e)
{
eventsClass.StartedWorkEvent += EventsClassOnStartedWorkEvent;
eventsClass.FinishedWorkEvent += EventsClassOnFinishedWorkEvent;
eventsClass.DoWork();
}
}
}
【问题讨论】:
-
感谢您的回复 @Angevil 我现在已经制作了
DoWork()async并且它有效。我通过使用:await Task.Run( ()=> { //while loop in here]);并在任务之前/之后触发事件。你是这个意思吧? -
试试
Dispatcher.Invoke( () =>ResultLabel.Content = e.Result );见here