2011年10月30日日曜日

[C# .NET] ウエイトカーソルを表示する方法

小ネタですか、.NETフォームアプリケーションで、いわゆるウエイトカーソルを表示させたいときの処理についてです。

Application.UseWaitCursorとControl.UseWaitCursorのプロパティですが、これらはいわゆるメインスレッドの制御を止めてしまいます。そのため、メインスレッドからUseWaitCursorを変更するのは適切ではありません。別スレッドからメインスレッドをどうしても止めたいときに使うことを想定しているようです。

そのため、単純にメインスレッドで、どうしても時間がかかってしまう処理をする場合には、Form.Cursorプロパティを変更するが適切でしょう。
処理の前にForm.CursorにCursors.WaitCursorを設定して、終了後にCursors.Defaultに変更するという処理になります。

そもそも、メインスレッドで処理をしているので、アプリケーションはフリーズ状態なので、カーソルを変更するだけでよいということになります。

2010年10月9日土曜日

[.NET] C#ジェネリック IEnumerableの実装

小ネタですが、IEnumeratable(T)の実装についてです。
とりあえず、ソースコードです。

using System.Collections.Generic;
using System.Collections;

class MyClass<T> : IEnumerable<T>
{
    public int Count { get { return ...; } } //データの数
    public T this[int index]
    {
        get { return ...; } //indexを使ってデータを返す
    }
    public IEnumerator<T> GetEnumerator()
    {
        for (int i = 0; i < Count; i++)
        {
            yield return this[i];
        }
    }
    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}

IEnumeratorがジェネリックにも存在するので、変な記述に見えるのかもしれません。
混乱をさせるためにはusingを使わずにIEnumeratorを書けばよいかもしれません。