我的项目需要按事件更新一些 UI 元素,并且一些事件在异步或后台线程中触发。所以我需要在事件处理程序中添加一些线程安全的代码。
但我发现项目中有很多相同的情况。这些零散的线程安全代码让整个项目代码相当难看,希望有办法改进。
这是其他线程中火灾事件的示例代码:
public static class MyAsyncClass
{
public static event Action MyEvent;
public static void AsyncCallEvent()
{
//...
Task.Run(() => {
while(runningFlag)
{
//...
if(flag)
MyEvent?.Invoke();
}
});
}
}
public class MyWindow : Window
{
//...
private void OtherMethod()
{
UpdateText();
}
private void Init()
{
MyAsyncClass.MyEvent += UpdateText;
}
private void UpdateText()
{
//Do update
}
//...
}
这里有两种 updateText 代码:
//Clear, but not cross-thread safety
//will fail in cross-thread event invoking
private void UpdateText()
{
MyTextBox.Text = "NewText";
}
//Cross-thread safe, but make code noisy
private void UpdateText()
{
Dispatcher.Invoke(() => MyTextBox.Text = "NewText");
}
当然,第二个代码肯定更好,但是如果将它添加到所有可能被异步调用的事件处理程序中,代码会变得让人不愉快。
有更清洁的解决方案吗?