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)
这可能是另一种方法.这里输入作为参数化传递,并且在委托事件中传递返回类型,这样当线程完成时将调用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)
我喜欢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)
| 归档时间: |
|
| 查看次数: |
53835 次 |
| 最近记录: |