6

一定の間隔で特定のメソッドを呼び出す必要があるコンソール アプリケーションを作成しています。

私はそれを検索し、System.Threading.Timerクラスがそのような機能を実現できることを発見しましたが、それを実装する方法を完全には理解していません。

私はこれを試しました:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Timer x = new Timer(test, null, 0, 1000);
            Console.ReadLine();
        }

        public static void test()
        {
            Console.WriteLine("test");
        }
    }
}

しかし、次のTimer x = new Timer(test, null, 0, 1000);行にエラーが表示されます。

System.Threading.Timer.Timer(System.Threading.TimerCallback, object, int, int)' に最適なオーバーロードされたメソッドの一致には、無効な引数がいくつかあります

これを適切に機能させる方法は本当にわかりませんが、初心者向けのタイマーを説明できるリンクや何かがあれば、感謝します。

4

3 に答える 3

16

問題は、test()メソッドの署名:

public static void test()

に必要な署名と一致しませんTimerCallback:

public delegate void TimerCallback(
    Object state
)

つまり、メソッドTimerCallbackから直接 を作成することはできません。test最も簡単なことは、testメソッドのシグネチャを変更することです。

public static void test(Object state)

または、コンストラクター呼び出しでラムダ式を使用できます。

Timer x = new Timer(state => test(), null, 0, 1000);

Test.NET の命名規則に従うために、メソッド名は .NETではなく大文字で始める必要があることに注意してくださいtest

于 2012-12-23T14:48:43.490 に答える
4

TimerCallbackdelegate (Timer使用するコンストラクターの最初の引数) は、 type の 1 つの引数 (状態) を取りますobject

testメソッドにパラメーターを追加するために必要なすべてのこと

public static void test(object state)
{
    Console.WriteLine("test");
}

そして、問題は解決されます。

于 2012-12-23T14:55:51.553 に答える
1

例外を解決するには、次のようにテストメソッドを記述します。

public static void test(object state)
        {
            Console.WriteLine("test");
        }
于 2012-12-23T19:14:45.163 に答える