C# 由多个线程并发调用方法并报告每个线程的进度

C# 由多个线程并发调用方法并报告每个线程的进度,c#,winforms,multithreading,C#,Winforms,Multithreading,我想在c#中创建一个windows应用程序,它将通过多个线程同时调用一个方法。并在Windows窗体sreen上报告每个线程的开始和完成 要调用的方法接受两个参数并返回一个对象 请帮忙 如能答复,将不胜感激 提前感谢。来自 static void Main() { Func方法=工作; 方法。开始检查(“试验”,完成,方法); // ... // } 静态整型工作(字符串s){返回s.Length;} 静态无效完成(IAsyncResult cookie) { var target=(Func)

我想在c#中创建一个windows应用程序,它将通过多个线程同时调用一个方法。并在Windows窗体sreen上报告每个线程的开始和完成

要调用的方法接受两个参数并返回一个对象

请帮忙

如能答复,将不胜感激

提前感谢。

来自

static void Main()
{
Func方法=工作;
方法。开始检查(“试验”,完成,方法);
// ...
//
}
静态整型工作(字符串s){返回s.Length;}
静态无效完成(IAsyncResult cookie)
{
var target=(Func)cookie.AsyncState;
int result=target.EndInvoke(cookie);
Console.WriteLine(“字符串长度为:”+result);
}
基本上,“Work”是您希望在另一个线程上运行的方法。“完成”是您希望在“工作”完成时调用的方法-您可以将状态报告代码放在此处。method.BeginInvoke采用与Work相同的参数,外加两个其他参数:回调和状态信息,它们可以是您想要的任何内容。回调函数需要接受一个参数:IAsyncResult。您可以通过获取IAsyncResult的AsyncState来访问传入的状态信息。在上面的例子中,“目标”指的是与“方法”相同的东西。这很有用-这意味着您可以对方法/目标调用“EndInvoke”,这将为您提供所需的返回值。“result”是“Work”的返回值

如果您需要多个线程,只需拥有多个委托(如上面示例中的“method”),然后依次启动所有委托。您可以使它们都具有相同的回调,也可以使它们具有不同的回调。这取决于你


希望这有帮助

我应该注意-BeginInvoke立即返回;它不会等待开始执行的线程。
static void Main()
{
    Func<string, int> method = Work;
    method.BeginInvoke ("test", Done, method);
   // ...
   //
}

static int Work (string s) { return s.Length; }

static void Done (IAsyncResult cookie)
{
    var target = (Func<string, int>) cookie.AsyncState;
    int result = target.EndInvoke (cookie);
    Console.WriteLine ("String length is: " + result);
}