如何在带有参数的线程中调用该方法并返回一些值

rat*_*tty 6 c# multithreading method-call

我喜欢在带有参数的线程中调用该方法,并在此处返回一些值示例

class Program
{
    static void Main()
    {
        Thread FirstThread = new Thread(new ThreadStart(Fun1));
        Thread SecondThread = new Thread(new ThreadStart(Fun2));
        FirstThread.Start();
        SecondThread.Start();
    }
    public static void Fun1()
    {
        for (int i = 1; i <= 1000; i++)
        {
            Console.WriteLine("Fun1 writes:{0}", i);
        }
    }
    public static void Fun2()
    {
        for (int i = 1000; i >= 6; i--)
        {
            Console.WriteLine("Fun2 writes:{0}", i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道上面的例子运行成功,但如果方法fun1像这样

public int fun1(int i,int j)
{
    int k;
    k=i+j;
    return k;
}
Run Code Online (Sandbox Code Playgroud)

那怎么能在线程中调用它?

Mar*_*ell 24

您应该能够使用匿名方法或lambda来提供完整的静态检查:

Thread FirstThread = new Thread(() => Fun1(5, 12));
Run Code Online (Sandbox Code Playgroud)

或者如果你想对结果做些什么:

Thread FirstThread = new Thread(() => {
    int i = Fun1(5, 12);
    // do something with i
});
Run Code Online (Sandbox Code Playgroud)

但请注意,这个"做某事"仍然在新线程的上下文中运行(但是可以访问外部方法中的其他变量(Main)由"捕获的变量"提供).

如果你有C#2.0(而不是上面),那么:

Thread FirstThread = new Thread((ThreadStart)delegate { Fun1(5, 12); });
Run Code Online (Sandbox Code Playgroud)

和

Thread FirstThread = new Thread((ThreadStart)delegate {
    int i = Fun1(5, 12);
    // do something with i
});
Run Code Online (Sandbox Code Playgroud)


Moh*_*vel 7

这可能是另一种方法.这里输入作为参数化传递,并且在委托事件中传递返回类型,这样当线程完成时将调用Delegate.当线程完成时,这将很好地获得结果.

 public class ThreadObject
    {
        public int i;
        public int j;
        public int result;
        public string Name;
    }



    public delegate void ResultDelegate(ThreadObject threadObject);

    public partial class Form1 : Form
    {

        public event ResultDelegate resultDelete;

        public Form1()
        {
            InitializeComponent();

            resultDelete += new ResultDelegate(resultValue);
        }

        void resultValue(ThreadObject threadObject)
        {
            MessageBox.Show("Thread Name : " + threadObject.Name + " Thread Value : " + threadObject.result);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ThreadObject firstThreadObject = new ThreadObject();
            firstThreadObject.i = 0;
            firstThreadObject.j = 100;
            firstThreadObject.Name = "First Thread";

            Thread firstThread = new Thread(Fun);
            firstThread.Start(firstThreadObject);


            ThreadObject secondThreadObject = new ThreadObject();
            secondThreadObject.i = 0;
            secondThreadObject.j = 200;
            secondThreadObject.Name = "Second Thread";

            Thread secondThread = new Thread(Fun);
            secondThread.Start(secondThreadObject);

        }


        private void Fun(object parameter)
        {
            ThreadObject threadObject = parameter as ThreadObject;

            for (; threadObject.i < threadObject.j; threadObject.i++)
            {
                threadObject.result += threadObject.i;

                Thread.Sleep(10);
            }

            resultValue(threadObject);
        }
    }
Run Code Online (Sandbox Code Playgroud)


Yak*_*ner 7

我喜欢Mark Gravell的回答.只需稍加修改,您就可以将结果传递回主线程:

int fun1, fun2;
Thread FirstThread = new Thread(() => {
    fun1 = Fun1(5, 12);
});
Thread SecondThread = new Thread(() => {
    fun2 = Fun2(2, 3); 
});

FirstThread.Start();
SecondThread.Start();
FirstThread.Join();
SecondThread.Join();

Console.WriteLine("Fun1 returned {0}, Fun2 returned {1}", fun1, fun2);
Run Code Online (Sandbox Code Playgroud)