UI源类 - 独立线程

时间:2014-07-11 15:26:34

标签: c# wpf multithreading dispatcher

我有一些用WPF编写的日志控制台。此控制台基于RichTextBox。 我通过构造函数依赖注入将此RichTextBox移动到完全不同的类。

class LogManager
{
    private readonly System.Windows.Controls.RichTextBox richTextBox;
    private readonly FlowDocument flowDocument;
    private readonly Paragraph commandParagraph;
    public LogManager(System.Windows.Controls.RichTextBox richTextBox)
    {
        if (richTextBox == null)
        {
            throw new ArgumentNullException("richTextBox");
        }

        this.richTextBox = richTextBox;

        flowDocument = new FlowDocument();
        commandParagraph = new Paragraph();

        richTextBox.Document = flowDocument;
   // (...)

这就是为什么我可以使用以下方法更改此框的值:

commandParagraph.Inlines.Add(new Run("Some logs message"));

它的工作完全正常但为时已晚。我把我的原木装进了某种包装中,大多数都是在程序完成他的工作后收入的。我猜它是因为只使用一个线程来管理工作'和'记录'。 我通过singleton

引用 LogManager
public sealed class UCSSBase : INotifyPropertyChanged
{
    private static volatile UCSSBase instance;
    private static object syncRoot = new Object();

    private UCSSBase() 
    {
        var progress = new Progress<string>(s => CurrentStatusElement = s);
        GDM = new GeneticDataManager(progress);
        dm = new DataManager(progress);
    }

    public static UCSSBase Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (UCSSBase.logs == null)
                        throw new InvalidOperationException("Log console cannot be a null");

                    if (instance == null)
                        instance = new UCSSBase();
                }
            }

            return instance;
        }
    }

    private static LogManager logs;

    internal static LogManager Logs
    {
        get 
        {
            return UCSSBase.logs;
        }
        set
        {
            if(value == null)
            {
                throw new ArgumentNullException("value");
            }
            if (UCSSBase.logs != null)
            {
                throw new InvalidOperationException();
            }
            UCSSBase.logs = value;
        }
    }
//(...)

所以,我的问题是,如何轻松更改程序以允许我的LogManager独立于系统的其余部分工作? (我通过这个sigleton在系统的很多地方引用控制台来添加新的日志)

0 个答案:

没有答案