AvalonEdit 更改所有者线程
AvalonEdit Change owner thread
我使用 AvalonEdit 已经 2 年多了,没有任何问题,而且效果很好
我只是面临一个关于从后台线程更改文本的问题
使用 SetOwnerThread()
方法每次触发 VerifyAccess()
异常,即使从主线程调用时也是如此
如果我在主线程中执行所有操作,它会工作,但这也会冻结 UI
这就是为什么我想在另一个线程中执行此操作并向用户显示加载指示器
我似乎无法理解我在这里做错了什么
任何帮助或想法将不胜感激
提前致谢
编辑:
我不想使用 Dispatcher.Invoke
因为它会在更新
时阻止 UI
示例代码
public async void EditTextSample()
{
Thread lUiThread = Thread.CurrentThread;
//SelectedTab is the current tab viewed by the user in my application
SelectedTab.TextEditor.Document.SetOwnerThread(null);
await Task.Run(() =>
{
Thread lBackgroundThread = Thread.CurrentThread;
SelectedTab.TextEditor.Document.SetOwnerThread(lBackgroundThread);
string lNewText = ""
SelectedTab.TextEditor.Document.Text = lNewText;
SelectedTab.TextEditor.Document.SetOwnerThread(lUiThread);
});
}
我回来了,
所以丹尼尔建议在后台线程上创建一个新的 TextDocument
就成功了
注意:这将重置撤消堆栈
这是一个示例解决方案:)
public async void EditTextSample()
{
Thread lUiThread = Thread.CurrentThread;
//SelectedTab is the current tab viewed by the user in my application
ITextSource lDocumentSnapshot = SelectedTab.TextEditor.Document.CreateSnapshot();
TextDocument lNewDocument = null;
await Task.Run(() =>
{
lNewDocument = new TextDocument();
string lCurrentText = lDocumentSnapshot.Text;
string lNewText = "";
lNewDocument.Text = lNewText;
lNewDocument.SetOwnerThread(lUiThread);
});
SelectedTab.TextEditor.Document = lNewDocument;
}
我使用 AvalonEdit 已经 2 年多了,没有任何问题,而且效果很好
我只是面临一个关于从后台线程更改文本的问题
使用 SetOwnerThread()
方法每次触发 VerifyAccess()
异常,即使从主线程调用时也是如此
如果我在主线程中执行所有操作,它会工作,但这也会冻结 UI
这就是为什么我想在另一个线程中执行此操作并向用户显示加载指示器
我似乎无法理解我在这里做错了什么
任何帮助或想法将不胜感激
提前致谢
编辑:
我不想使用 Dispatcher.Invoke
因为它会在更新
示例代码
public async void EditTextSample()
{
Thread lUiThread = Thread.CurrentThread;
//SelectedTab is the current tab viewed by the user in my application
SelectedTab.TextEditor.Document.SetOwnerThread(null);
await Task.Run(() =>
{
Thread lBackgroundThread = Thread.CurrentThread;
SelectedTab.TextEditor.Document.SetOwnerThread(lBackgroundThread);
string lNewText = ""
SelectedTab.TextEditor.Document.Text = lNewText;
SelectedTab.TextEditor.Document.SetOwnerThread(lUiThread);
});
}
我回来了,
所以丹尼尔建议在后台线程上创建一个新的 TextDocument
就成功了
注意:这将重置撤消堆栈
这是一个示例解决方案:)
public async void EditTextSample()
{
Thread lUiThread = Thread.CurrentThread;
//SelectedTab is the current tab viewed by the user in my application
ITextSource lDocumentSnapshot = SelectedTab.TextEditor.Document.CreateSnapshot();
TextDocument lNewDocument = null;
await Task.Run(() =>
{
lNewDocument = new TextDocument();
string lCurrentText = lDocumentSnapshot.Text;
string lNewText = "";
lNewDocument.Text = lNewText;
lNewDocument.SetOwnerThread(lUiThread);
});
SelectedTab.TextEditor.Document = lNewDocument;
}