擁有大多數屬性的對象非常輕量級 - 文本最多200個字符。一個屬性是FlowDocument,它可以很大並且想要檢索它Async。當我使用以下消息設置Async = True時失敗:「調用線程無法訪問此對象,因爲不同的線程擁有它。」WPF綁定IsAsync失敗
<FlowDocumentReader Name="FlowDocumentPageViewer1" HorizontalAlignment="Stretch"
Document="{Binding Source={x:Static Application.Current}, Path=MyGabeLib.Search.SelectedDoc.DocFlowDocument, Mode=OneWay, IsAsync=True}" />
生產獲取更復雜但IsAsyc上的相同失敗即使使用簡單的硬編碼FlowDocument也是如此。
public FlowDocument DocFlowDocument
{
get
{
FlowDocument docFlowDocumentFast = new FlowDocument();
Paragraph p = new Paragraph();
Run r = new Run();
r.Foreground = System.Windows.Media.Brushes.Red;
r.Text = "Hard Code Simple FlowDocument";
p.Inlines.Add(r);
docFlowDocumentFast.Blocks.Add(p);
return docFlowDocumentFast;
}
{
它調用SelectedDoc.DocFlowDocument並返回文檔! 與IsAsync = False它運行得很好。 我認爲問題是靜態源,但顯然我不知道如何解決它。
public partial class App : Application
{
private static GabeLib staticGabeLib = new GabeLib();
private GabeLib myGabeLib = staticGabeLib;
public GabeLib MyGabeLib
{ get { return myGabeLib; } }
public static GabeLib StaticGabeLib
{ get { return staticGabeLib; } }
}
當GabeLib啓動時,它從數據庫中讀取應用程序和用戶設置。
如果有更好的方法來解決這個問題,我會試試看。由於FlowDocument可以爲3 MB,並且所有其他屬性10K組合在一起,所以這是大性能打擊,最常用的按鈕是下一個對象。 FlowDocument來自SQL中的varchar(max),並用突出顯示的換行符和單詞格式化。它不僅很大 - 與其他屬性相比,它也很昂貴。
FlowDocumentReader本身似乎有一些異步支持,因爲在大文檔上我快速獲得第一頁,然後以大約100 /秒的速度加載頁面。但我仍然希望在檢索完所有其他屬性後獲取第1頁。
問題在於martin聲明「由於FlowDocument是調度對象,因此只能從創建它的線程訪問它」。
解決方案是序列化爲XAML字符串。
public string XAMLdocFlowDocument
{
get
{
Thread.Sleep(6000);
return XamlWriter.Save(FlowDocumentSlow);
}
}
綁定到字符串轉換器
<FlowDocumentReader Grid.Row="3" Grid.Column="0" VerticalAlignment="Stretch"
Document="{Binding Path=XAMLdocFlowDocument, IsAsync=True,
Converter={StaticResource flowDocumentToXamlConverter}, Mode=OneWay}" />
轉換
[ValueConversion(typeof(string), typeof(FlowDocument))]
public class FlowDocumentToXamlConverter : IValueConverter
{
#region IValueConverter Members
/// <summary>
/// Converts from XAML markup to a WPF FlowDocument.
/// </summary>
public object Convert(object value, System.Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
var flowDocument = new FlowDocument();
if (value != null)
{
var xamlText = (string)value;
flowDocument = (FlowDocument)XamlReader.Parse(xamlText);
}
// Set return value
return flowDocument;
}
在這種情況下什麼是FallbackValue?這是否需要在綁定中指定(因爲可能會在異步操作正在處理時應用此操作?) – Ricibob
仍然會因FallbackValue失敗。如果我做了PriorityBinding,它會通過非異步,甚至調用異步獲取,但在XMAL中失敗。 – Paparazzi
爲什麼downvote?什麼不明確,顯示缺乏研究,或沒有用處? – Paparazzi