当一个COM对象在STA线程上实例化时,该线程通常必须实现一个消息泵,以便为来回调用其他线程(见这里).
可以手动泵送消息,或者依赖于某些(但不是全部)线程阻塞操作在等待时自动泵送COM相关消息的事实.文档通常无助于决定哪个是哪个(参见相关问题).
如何确定线程阻塞操作是否会在STA上泵送COM消息?
到目前为止的部分清单:
阻断其业务做泵*:
Thread.Join
WaitHandle.WaitOne
/ WaitAny
/WaitAll
(WaitAll
不能从一个STA线程虽然称为)GC.WaitForPendingFinalizers
Monitor.Enter
(因此lock
) - 在某些条件下ReaderWriterLock
阻止不泵送的操作:
Thread.Sleep
Console.ReadKey
(在某处读)*注意Noseratio的答案说,即使是操作泵,也是为非常有限的未公开的COM特定消息集.
这是我正在使用的功能:
private void Convert2Morse(object obj)
{
TextConverted = am.Convert(NormalText);
foreach (char symbol in TextConverted)
{
int milliseconds = 0;
switch (symbol)
{
case '·': milliseconds = 500; break;
case '—': milliseconds = 1000; break;
case ' ': continue;
default: throw new Exception("Something is wrong");
}
System.Media.SystemSounds.Beep.Play();
System.Threading.Thread.Sleep(milliseconds);
}
}
Run Code Online (Sandbox Code Playgroud)
TextConverted属性显示在textBox中,但刷新直到完成子例程.
有没有办法可以显示刷新UI?
我有一个窗口:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel Orientation="Horizontal" Background="{Binding BackgroundColor}">
<Button Content="Button1" Click="ButtonBase_OnClick"/>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
而这个CodeBehind窗口:
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using WpfApplication1.Annotations;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private Brush _backgroundColor;
public MainWindow()
{
InitializeComponent();
DataContext = this;
Background = Brushes.Orange;
}
public Brush BackgroundColor
{
get { …
Run Code Online (Sandbox Code Playgroud)