线程:线程类对象没有使用int []返回类型

时间:2018-04-09 22:36:19

标签: c# .net multithreading

我使用此函数对数组进行排序。我必须在一个线程示例中使用。

public int[] Arrsort()
{
    int[] array = new int[100];
    Random rand = new Random(12345);

     for (int i = 0; i <100; i++)
     {
        array[i] = rand.Next(100);
     }
    Array.Sort(array);
    return array;
}

该函数的问题在于它没有使用Thread类对象。就像我在传递时一样 - &gt;

for (int i = 0; i < 5; i++)
{
    Thread newThread = new Thread(p.Arrsort);
    newThread.Start();
    int[] arrsort1 = p.Arrsort();
    // for (int n=0; n<arrsort.Length; n++)
    Console.WriteLine(arrsort1[n]); //printing the elements
}

代码产生了这个错误...

  

错误CS0407&#39; int [] Program.Arrsort()&#39;有错误的返回类型

因此,我被迫做出另一个功能

public void Thrsort() { Arrsort(); } 
//void method created so Arrsort() can be called in thread
//the Thread class is not taking int[] types directly (please see)   

我将Thrsort()传递给线程对象。然后只编译了我的代码。

有没有其他方法可以解决问题,以便我不必创建另一个函数,即thrsort()?请在函数arrsort()的代码中建议编辑。

2 个答案:

答案 0 :(得分:0)

当你启动一个线程时,它将开始并行运行。你还不知道什么时候结束。这就是为什么你不能只读取函数的返回值 - 它仍然可以运行!这就是为什么所有线程proc都返回void。

您可以采取一些措施来恢复数据。一种是在完成后设定一个商定的变量,例如

int[] buffer = null;

public void Arrsort()
{
    /* snip */
    Array.Sort(array);
    buffer = array;
}

然后阅读:

if (!newThread.IsAlive)
{
    Console.WriteLine("Thread has finished and the output is as follows:");
    Console.WriteLine(string.Join(",", buffer));
}

这是一种蛮力的方式来做这件事,并且有点风险 - 如果你在编写阵列的同时仍然在编写时会遇到一些严重的问题。有更安全的方式。

一种“更好”的方法是使用Task.Run将它放在线程池上,然后等待它。

public int[] Arrsort()
{
    /* snip */
    Array.Sort(array);
    return array;
}

然后使用Task.Run运行它,它将把它放在线程池中:

    var task = Task.Run( () => Arrsort() );
    var result = task.Result;  //Will block until result is available
    Console.WriteLine(string.Join(",", result));

答案 1 :(得分:0)

我使用此函数对数组进行排序。我必须在线程示例中使用。

public int[] Arrsort()
{
    int[] array = new int[100];
    Random rand = new Random(12345);

     for (int i = 0; i <100; i++)
     {
        array[i] = rand.Next(100);
     }
    Array.Sort(array);
    return array;
}

代码产生了这个错误...

  

错误CS0407&#39; int [] Program.Arrsort()&#39;有错误的返回类型

该函数的问题在于它没有使用Thread类对象。就像我传递时一样:

for (int i = 0; i < 5; i++)
{
    Thread newThread = new Thread(p.Arrsort);
    newThread.Start();
    int[] arrsort1 = p.Arrsort();
    // for (int n=0; n<arrsort.Length; n++)
    Console.WriteLine(arrsort1[n]); //printing the elements
}

当你开始一个线程时,它将开始并行运行。你不知道什么时候结束。 这就是为什么你不能只读取函数的返回值 - 它仍然可以运行! 这就是为什么所有线程程序都返回void。