0

こんにちは、sleeptime とスレッド オブジェクトをメソッドに渡し、そのメソッドを for ループで呼び出したいと思います。以下のコードをご覧ください

public delegate void PasParamsToThrdFunc(int integer, object obj2);
class Program
{
    Thread[] newThread=new Thread[10];

    static void Main(string[] args)
    {
        Program pr = new Program();
        pr.ThreadDeclaration();
        Console.Read();
    }

    public void ThreadDeclaration()
    {
        int time = 5000;
        for(int i=1;i<3;i++)
        {
            time = time * i;
            string s = i.ToString();
            ThreadStart starter = () => PasParamsToThrdFunc(time, newThread[i]);
            newThread[i] = new Thread(starter);
            newThread[i].Name = i.ToString();
            newThread[i].Start();
        }

    }

    public void PasParamsToThrdFunc(int waitTime, Thread obj)
    {
        Thread.Sleep(waitTime);
        Console.WriteLine("" + waitTime + " seconds completed and method is called for thread"+obj.Name+"");
        obj.Abort();
    }
  }

1 番目のスレッドを 5 秒後に呼び出してオブジェクトを強制終了し、2 番目のスレッドについても同じことを行い、10 秒で強制終了します。助けてください...よろしくお願いします。

4

2 に答える 2

0

1-渡しnewThread[i]PasParamsToThrdFuncときはnullです。に変更しますi

2-変数閉じないようにする必要がある場合がありiますtime

public void ThreadDeclaration()
{
    int time = 5000;
    for (int i = 1; i < 3; i++)
    {
        int J = i; // <----
        int timez = time * i; // <----
        string s = i.ToString();

        ThreadStart starter = () => PasParamsToThrdFunc(timez, J);
        newThread[i] = new Thread(starter);
        newThread[i].Name = i.ToString();
        newThread[i].Start(); 
    }

}

public void PasParamsToThrdFunc(int waitTime, int i )
{
    Thread.Sleep(waitTime);
    Console.WriteLine("" + waitTime + " seconds completed and method is called for thread" + newThread[i].Name + "");
    newThread[i].Abort(); // <-- No need
}
于 2012-11-12T13:47:55.973 に答える
0

私が見ることができるいくつかの問題があります:

  • スレッド関数に渡すパラメーターを使用して、変更されたクロージャーにアクセスしています (これらのパラメーターを渡した後に変更しないでください)。
  • スレッドのハンドルをそれ自体に渡し、それを使用してそれ自体を中止します。スリープ後に終了するだけなので、それを行う必要はありません。
  • 時間間隔 * i を使用するのではなく、反復ごとに自分自身を i で乗算することにより、時間を誤って計算しています。

代わりに次のようにしてみてください。

using System;
using System.Threading;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Program pr = new Program();
            pr.ThreadDeclaration();
            Console.Read();
        }

        public void ThreadDeclaration()
        {
            int timeInterval = 5000;

            for (int i=1; i<3; i++)
            {
                int time = timeInterval * i;
                ThreadStart starter = () => PasParamsToThrdFunc(time);
                var thread = new Thread(starter) {Name = i.ToString()};
                thread.Start();
            }
        }

        public void PasParamsToThrdFunc(int waitTime)
        {
            Thread.Sleep(waitTime);
            Console.WriteLine("" + waitTime + " seconds completed and method is called for thread" + Thread.CurrentThread.Name);

        }
    }
}                                                                                            
于 2012-11-12T13:51:24.230 に答える