هل هناك فئة للأطفال Textwriter تطلق الحدث في حالة كتابة النص؟

StackOverflow https://stackoverflow.com/questions/3708454

سؤال

لقد كتبت طريقة تقبل أ TextWriter كحجة (عادةً Console.out ، ولكن ليس بالضرورة).

عندما أسمي هذه الطريقة ، تتم كتابة بعض معلومات التقدم إلى TextWriter. ومع ذلك ، نظرًا لأن هذه الطريقة يمكن أن تعمل لفترة طويلة ، أريد تحديث واجهة المستخدم الخاصة بي مع بعض معلومات الحالة.

حاليا ، أنا أستخدم أ StringWriter ولكن ليس لديها أي أحداث. لذا في المرة الأولى التي أحصل فيها على نتيجة StringWriter هو بعد الانتهاء من الطريقة.

الآن أنا أبحث عن فصل يرث من TextWriter ويطلق حدثًا معدومًا أو شيء من هذا القبيل. أعلم أن هذا لا ينبغي أن يكون من الصعب تنفيذه ، لكنني أراهن أن فريق CLR فعل ذلك بالفعل من أجلي ، لا يمكنني العثور على الفصل المناسب.

هل كانت مفيدة؟

المحلول

إذا كان أي شخص مهتمًا ، فهذا فئة تمتد StringWriter() الفصل لإطلاق الأحداث بعد كل مكالمة writer.Flush().

لقد أضفت أيضًا posibillity للاتصال تلقائيًا Flush() بعد كل كتابة ، لأن ، في حالتي ، مكون من جهة خارجية ، كتب إلى وحدة التحكم ، لم يفعل تدفقًا.

استخدام العينة:

void DoIt()
{
    var writer = new StringWriterExt(true); // true = AutoFlush
    writer.Flushed += new StringWriterExt.FlushedEventHandler(writer_Flushed);

    TextWriter stdout = Console.Out;
    try
    {
        Console.SetOut(writer);
        CallLongRunningMethodThatDumpsInfoOnConsole();
    }
    finally
    {
        Console.SetOut(stdout);
    }
}

الآن يمكنني عرض بعض معلومات الحالة في الوقت المناسب فقط ولا أحتاج إلى الانتظار حتى تنتهي الطريقة.

void writer_Flushed(object sender, EventArgs args)
{
    UpdateUi(sender.ToString());
}

وهنا الفصل:

public class StringWriterExt : StringWriter
{
    [EditorBrowsable(EditorBrowsableState.Never)]
    public delegate void FlushedEventHandler(object sender, EventArgs args);
    public event FlushedEventHandler Flushed;
    public virtual bool AutoFlush { get; set; }

    public StringWriterExt()
        : base() { }

    public StringWriterExt(bool autoFlush)
        : base() { this.AutoFlush = autoFlush; }

    protected void OnFlush()
    {
        var eh = Flushed;
        if (eh != null)
            eh(this, EventArgs.Empty);
    }

    public override void Flush()
    {
        base.Flush();
        OnFlush();
    }

    public override void Write(char value)
    {
        base.Write(value);
        if (AutoFlush) Flush();
    }

    public override void Write(string value)
    {
        base.Write(value);
        if (AutoFlush) Flush();
    }

    public override void Write(char[] buffer, int index, int count)
    {
        base.Write(buffer, index, count);
        if (AutoFlush) Flush();
    }
}

نصائح أخرى

لا يوجد شيء من هذا القبيل في BCL ، ولكن كما لاحظت بالفعل ، لن يكون من الصعب تنفيذ هذا.

حظا طيبا وفقك الله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top