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();
}