Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Parallel.Invoke.c返回值#_C#_.net - Fatal编程技术网

C# 从Parallel.Invoke.c返回值#

C# 从Parallel.Invoke.c返回值#,c#,.net,C#,.net,我有4种生成Excel的方法,每种方法都会从数据库返回10000条记录,并将这些记录推送到一个带有不同表格的Excel中。每个方法都返回列表 CAMSFormat CAMS = new CAMSFormat(); CAMS.CAMSTrailPSI = bl.CAMSTrailPSIoutput(FromDate, ToDate, MemoType); CAMS.CAMSUpfrontPSI = bl.CAMSUpfrontPSIoutput(FromDate, ToDate, MemoTyp

我有4种生成Excel的方法,每种方法都会从数据库返回10000条记录,并将这些记录推送到一个带有不同表格的Excel中。每个方法都返回列表

CAMSFormat CAMS = new CAMSFormat();

CAMS.CAMSTrailPSI = bl.CAMSTrailPSIoutput(FromDate, ToDate, MemoType);
CAMS.CAMSUpfrontPSI = bl.CAMSUpfrontPSIoutput(FromDate, ToDate, MemoType);
CAMS.CAMSTrailSIPSTP = bl.CAMSTrailSIPSTPoutput(FromDate, ToDate, MemoType);
CAMS.CAMSUpfrontSIPSTP = bl.CAMSUpfrontSIPSTPoutput(FromDate, ToDate, MemoType);
问题是返回数据需要2分钟以上

现在我想把它作为对数据库的并发调用,我强迫自己使用Parallel.Invoke

Parallel.Invoke(
    () => bl.CAMSTrailPSIoutput(FromDate, ToDate, MemoType),
    () => bl.CAMSTrailSIPSTPoutput(FromDate, ToDate, MemoType),
    () =>  bl.CAMSUpfrontPSIoutput(FromDate, ToDate, MemoType),
    () => bl.CAMSUpfrontSIPSTPoutput(FromDate, ToDate, MemoType));
如何从Parallel.Invoke返回值?如何将每个列表分配给主类

我已将上述代码更改如下。声明本地列表,单独列表,最后附加到主类,但是我仍然得到错误。如果我不使用Parallel.Invoke,这些方法工作得非常好

List<CAMSTrailPSI> result1 = new List<CAMSTrailPSI>();
List<CAMSUpfrontPSI> result2 = new List<CAMSUpfrontPSI>();

Parallel.Invoke(
    () => {
        result1 = bl.CAMSTrailPSIoutput(FromDate, ToDate, MemoType);
    },
    () => {
        result2 = bl.CAMSUpfrontPSIoutput(FromDate, ToDate, MemoType);
    });
CAMS.CAMSTrailPSI = result1;
List result1=新列表();
列表结果2=新列表();
并行调用(
() => {
结果1=bl.CAMSTrailPSIoutput(FromDate、ToDate、MemoType);
},
() => {
结果2=bl.CAMSUpfrontPSIoutput(FromDate、ToDate、MemoType);
});
CAMS.CAMSTrailPSI=结果1;

假设对
bl
类的调用是线程安全的,那么这种模式可能最适合您:

var t_CAMSTrailPSI = Task.Factory.StartNew(() => bl.CAMSTrailPSIoutput(FromDate, ToDate, MemoType));
var t_CAMSUpfrontPSI = Task.Factory.StartNew(() => bl.CAMSUpfrontPSIoutput(FromDate, ToDate, MemoType));
var t_CAMSTrailSIPSTP = Task.Factory.StartNew(() => bl.CAMSTrailSIPSTPoutput(FromDate, ToDate, MemoType));
var t_CAMSUpfrontSIPSTP = Task.Factory.StartNew(() => bl.CAMSUpfrontSIPSTPoutput(FromDate, ToDate, MemoType));

Task.WaitAll(t_CAMSTrailPSI, t_CAMSUpfrontPSI, t_CAMSTrailSIPSTP, t_CAMSUpfrontSIPSTP);

CAMSFormat CAMS = new CAMSFormat();

CAMS.CAMSTrailPSI = t_CAMSTrailPSI.Result;
CAMS.CAMSUpfrontPSI = t_CAMSUpfrontPSI.Result;
CAMS.CAMSTrailSIPSTP = t_CAMSTrailSIPSTP.Result;
CAMS.CAMSUpfrontSIPSTP = t_CAMSUpfrontSIPSTP.Result;

Task.WaitAll
并不是绝对必要的,但它有助于用代码阐明您的意图。

欢迎使用。请浏览一下您是否特别想使用
并行。调用
?CAMSFormat是一个普通类,包含另一个类的列表公共类CAMSFormat{public List CAMSTrailPSI{get;set;}}}我们在这里看不到Excel,但这肯定不会保证线程安全。我也不太确定你的数据库工作。你能具体说明一下你遇到了什么错误吗?