هل هناك فئة للأطفال Textwriter تطلق الحدث في حالة كتابة النص؟
-
02-10-2019 - |
سؤال
لقد كتبت طريقة تقبل أ 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 ، ولكن كما لاحظت بالفعل ، لن يكون من الصعب تنفيذ هذا.
حظا طيبا وفقك الله.