1

我需要完成类似的事情(他们告诉我用很多话解释更多......)

static MyReturnObject Function1(myObjectA parameter1, myObjectB parameter2) {...}

static void Test()
{
   Parallel.For( 0, 10, (index) =>
   {
     //create parameters y and z 
     x = Function1(y,z); 
     // Add x to an array
   });
   // Find the biggest x.
}

代码有效,但结果不准确。如果我使用“for”而不是“parallel.for”,我会得到准确的结果。

4

3 回答 3

3

我尝试按照您的规则执行代码,并且我确信可以这样做。

请在下面找到我在 Winform 应用程序中执行的代码。

public partial class Form1: Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
        }

        void Form1_Load(object sender, EventArgs e)
        {
            Test();
        }

        static int Function1(int parameter1, int parameter2)
        {
            return (parameter1 + parameter2);
        }

        static void Test()
        {
            int[] nums = Enumerable.Range(0, 1000000).ToArray();
            long total = 0;

            // Use type parameter to make subtotal a long, not an int
            Parallel.For<long>(0, nums.Length, () => 0, (j, loop, subtotal) =>
            {
                subtotal += (nums[j] + Function1(1,2));
                return subtotal;
            },
                (x) => Interlocked.Add(ref total, x)
            );

            MessageBox.Show(string.Format("The total is {0}", total));
        }
    }
于 2012-10-03T08:40:25.320 回答
0

是否可以在静态方法中调用另一个静态方法?
当然!

通过 Parallel.For?
为什么不?

使用不同的参数?
不知道我明白你在这里的意思。您是否希望为 Parallel.For 的每次迭代实例化新对象并将它们传递到 Function1 中?当然可以!

于 2012-10-03T08:40:07.113 回答
0

是的,这是可能的,请参见以下代码:

static void Main(string[] args)
{
    Console.WriteLine("\nUsing Parallel.For \n");

    Parallel.For(0, 10, i =>
    {
        Console.WriteLine("i = {0}, thread = {1}", i, Function1());
        Thread.Sleep(10);
    });

    Console.ReadLine();
}

static int Function1()
{
    return Thread.CurrentThread.ManagedThreadId; 
}
于 2012-10-03T08:46:03.693 回答