C# 为方法创建新线程

C# 为方法创建新线程,c#,wpf,multithreading,linq,C#,Wpf,Multithreading,Linq,我目前正在尝试为一个新的线程增加堆栈的大小,这样我就可以运行下面的方法,而不会让应用程序抛出堆栈溢出异常 public QuoteResult CalculateRates(TruckDb db, QuoteData data) { var result = new QuoteResult { Successful = false, Data = data }; //...EDIT with code samples

我目前正在尝试为一个新的线程增加堆栈的大小,这样我就可以运行下面的方法,而不会让应用程序抛出堆栈溢出异常

public QuoteResult CalculateRates(TruckDb db, QuoteData data)
{
    var result = new QuoteResult
    {
        Successful = false,
        Data = data
    };

    //...EDIT with code samples

        //Floor - 1
        var qisg = new QuoteItemSectionGroup
        {
            SectionGroup = db.SectionGroups.Where(x => x.Name == "Longitudinals" && x.Section == TruckSection.Floor).First(),
            StockItem = quoteItem.FloorSpec.Name == "Ali Floor Bakery" || quoteItem.FloorSpec.Name == "Trailer Floor" || quoteItem.FloorSpec.Name == "Use Existing Floor" ? null : quoteItem.BodyType.Name == "Insulated" || quoteItem.BodyType.Name == "Insulated Meat Hanger" ? db.StockItems.Where(x => x.StockCode == "SCH095").First()
                : quoteItem.BodyType.Name == "Royal Corrugated" || quoteItem.BodyType.Name == "Royal Smooth Glued" || quoteItem.BodyType.Name == "Royal Smooth Riveted" ||
                quoteItem.BodyType.Name == "Royal Tautliner" || quoteItem.BodyType.Name == "Penta Slider Curtain-side" || quoteItem.BodyType.Name == "Bakery Light Weight GRP" ||
                quoteItem.BodyType.Name == "Free Flow Bakery Body" || quoteItem.BodyType.Name == "Boardside GRP Body" || quoteItem.BodyType.Name == "Drop Side" || quoteItem.BodyType.Name == "Flat Deck" ? quoteItem.ChassisModel.Longitudinal : null
        };
        qisg.Quantity = qisg.StockItem == null ? 0 : 2;
        qisg.Length = qisg.StockItem == null ? 0 : Math.Round((quoteItem.BodyType.Name == "Royal Corrugated" || quoteItem.BodyType.Name == "Royal Smooth Glued" || quoteItem.BodyType.Name == "Smooth Folded" || quoteItem.BodyType.Name == "Royal Smooth Riveted" || quoteItem.BodyType.Name == "Bakery Light Weight GRP" || quoteItem.BodyType.Name == "Free Flow Bakery Body" || quoteItem.BodyType.Name == "Boardside GRP Body" || quoteItem.BodyType.Name == "Insulated" || quoteItem.BodyType.Name == "Insulated Meat Hanger" || quoteItem.BodyType.Name == "Drop Side" || quoteItem.BodyType.Name == "Flat Deck" ? -0.157
            : quoteItem.BodyType.Name == "Penta Slider Curtain-side" ? -0.150 : quoteItem.BodyType.Name == "Royal Tautliner" ? -0.060
            : 0) + (quoteItem.ExternalLength / 1000), 3);
        qisg.Weight = qisg.StockItem == null ? 0 : Math.Round(((double)qisg.Length * (double)qisg.Quantity) * (double)qisg.StockItem.Mass, 3);
        qisg.Cost = qisg.StockItem == null ? 0 : Math.Round(((double)qisg.Length * (double)qisg.Quantity) * (double)qisg.StockItem.UnitCost, 2);
        if (qisg.StockItem != null)
            quoteItem.SectionGroups.Add(qisg);

        //Floor - 2
        qisg = new QuoteItemSectionGroup
        {
            SectionGroup = db.SectionGroups.Where(x => x.Name == "Cross Member" && x.Section == TruckSection.Floor).First(),
            StockItem = quoteItem.FloorSpec.Name == "Ali Floor Bakery" || quoteItem.FloorSpec.Name == "Trailer Floor" || quoteItem.FloorSpec.Name == "Use Existing Floor" ? null : quoteItem.BodyType.Name == "Insulated" || quoteItem.BodyType.Name == "Insulated Meat Hanger" || quoteItem.BodyType.Name == "Penta Slider Curtain-side" ? db.StockItems.Where(x => x.StockCode == "SCH095").First()
                : quoteItem.BodyType.Name == "Royal Corrugated" || quoteItem.BodyType.Name == "Royal Smooth Glued" || quoteItem.BodyType.Name == "Royal Smooth Riveted" || quoteItem.BodyType.Name == "Royal Tautliner" || quoteItem.BodyType.Name == "Bakery Light Weight GRP" ||
                quoteItem.BodyType.Name == "Free Flow Bakery Body" || quoteItem.BodyType.Name == "Boardside GRP Body" || quoteItem.BodyType.Name == "Drop Side" || quoteItem.BodyType.Name == "Flat Deck" ? db.StockItems.Where(x => x.StockCode == "SCH075").First() : null
        };
        qisg.Quantity = qisg.StockItem == null ? 0 : Math.Floor(quoteItem.BodyType.Name == "Insulated" || quoteItem.BodyType.Name == "Insulated Meat Hanger" || quoteItem.BodyType.Name == "Royal Corrugated"
            || quoteItem.BodyType.Name == "Royal Smooth Glued" || quoteItem.BodyType.Name == "Royal Smooth Riveted" || quoteItem.BodyType.Name == "Royal Tautliner"
            || quoteItem.BodyType.Name == "Bakery Light Weight GRP" || quoteItem.BodyType.Name == "Free Flow Bakery Body" || quoteItem.BodyType.Name == "Boardside GRP Body" || quoteItem.BodyType.Name == "Drop Side" || quoteItem.BodyType.Name == "Flat Deck" ? ((quoteItem.ExternalLength / quoteItem.FloorChannelSpacing.Amount) + 2) 
            : quoteItem.BodyType.Name == "Penta Slider Curtain-side" ? (quoteItem.ExternalLength / quoteItem.FloorChannelSpacing.Amount) : 0);
        qisg.Length = qisg.StockItem == null ? 0 : Math.Round((quoteItem.BodyType.Name == "Royal Corrugated" || quoteItem.BodyType.Name == "Royal Smooth Glued" || quoteItem.BodyType.Name == "Smooth Folded" || quoteItem.BodyType.Name == "Royal Smooth Riveted" || quoteItem.BodyType.Name == "Bakery Light Weight GRP" || quoteItem.BodyType.Name == "Free Flow Bakery Body" || quoteItem.BodyType.Name == "Boardside GRP Body" || quoteItem.BodyType.Name == "Insulated" || quoteItem.BodyType.Name == "Insulated Meat Hanger" || quoteItem.BodyType.Name == "Drop Side" || quoteItem.BodyType.Name == "Flat Deck" ? -0.020
            : quoteItem.BodyType.Name == "Penta Slider Curtain-side" ? -0.070 : quoteItem.BodyType.Name == "Royal Tautliner" ? -0.030
            : 0) + (quoteItem.ExternalWidth / 1000), 3);
        qisg.Weight = qisg.StockItem == null ? 0 : Math.Round(((double)qisg.Length * (double)qisg.Quantity) * (double)qisg.StockItem.Mass, 3);
        qisg.Cost = qisg.StockItem == null ? 0 : Math.Round(((double)qisg.Length * (double)qisg.Quantity) * (double)qisg.StockItem.UnitCost, 2);
        if (qisg.StockItem != null)
            quoteItem.SectionGroups.Add(qisg);   

    //It continues on like this with about 80 more blocks of code like the above samples          

    result.Successful = true;
    return result;
}
我尝试过用人们在其他问题中提出的几种方式编码,但我不知道如何在新的线程中使用我的方法

以下是我的一个尝试:

void NewThread(QuoteResult result)
{
    const int stackSize = 0x400000;
    var T = new Thread(CalculateRates, stackSize);
    T.Start();
    T.Join();
}
但是,它抛出了一个错误:

匹配的最佳重载方法 'System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart, int)“”具有一些无效参数

正如您可以清楚地看到的,我不知道我在做什么,也不知道如何为我的方法创建一个新的线程,所以我确实希望得到很多批评。如果有人需要更多的代码示例或信息,请随时询问

提前谢谢你的帮助

如果这是个模糊的问题,我很抱歉

编辑

也使用Calculates方法的方法:


您可以使用
任务


参考上面提到的链接,而不是上面提到的,但是你有一个简单的语法错误


您没有传递线程方法“Calculates”的参数。 Thread方法应该只有一个类型为“object”的参数,可以传入,如

var t = new Thread(new ParameterizedThreadStart(youmethod);
t.Start(yourparam);
另一种解决方案是使用闭包。但一般来说,您只是没有为您试图调用的方法传递参数

检查MSDN中的样本:
您没有传入参数
计算所需的参数

您可以通过传入一个简单的lambda表达式来实现这一点:

void NewThread(QuoteResult result)
{
    //example for creating the parameters to pass in
    TruckDb db = new TruckDb();
    QuoteData data = new QuoteData();

    const int stackSize = 0x400000;
    var T = new Thread(() => CalculateRates(db, data), stackSize);
    T.Start();
    T.Join();
}

拥有一个
StackOverflowException
可能表明您应该对您的解决方案有另一个想法。你能给我们看一些代码吗?@JeroenvanLangen是的,我很快就会更新:)@JeroenvanLangen我已经添加了代码示例我不认为你提供的代码会引起
StackOverflowException
。我看不到递归。
calculates
是否在方法中的何处调用?使用两种不同的方法调用两次。我会更新编码。见编辑谢谢你的评论!你说的话很有道理,只是我得到了一个错误:“名称‘db’在当前上下文中不存在”。与“数据”相同:(这是因为你需要从某处获取参数。你需要知道你传递了什么,然后编辑代码以包含示例参数(很可能不是你想要的)。只是为了演示我的意思
var t = new Thread(new ParameterizedThreadStart(youmethod);
t.Start(yourparam);
void NewThread(QuoteResult result)
{
    //example for creating the parameters to pass in
    TruckDb db = new TruckDb();
    QuoteData data = new QuoteData();

    const int stackSize = 0x400000;
    var T = new Thread(() => CalculateRates(db, data), stackSize);
    T.Start();
    T.Join();
}