我正在使用Entity Framework和通用存储库模式.我使用以下方法添加对象.
public int Add<TEntity>(TEntity entity) where TEntity : class
{
DataContext.AddObject(GetEntityName<TEntity>(), entity);
return SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我也在考虑扩展它以支持多个实体.
public int Add<TEntity>(TEntity[] collection) where TEntity : class
{
foreach (TEntity item in collection)
{
DataContext.AddObject(GetEntityName<TEntity>(), item);
}
return SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
在上述场景中使用Parallel.ForEach而不是foreach循环会有实际好处吗?
另外因为我没有SaveChanges()在循环结束之前调用,如果有让我们说主键违规,它会被抛入循环内部还是SaveChanges()被调用时?我可以回滚更改吗?
我真的很困惑Parallel.ForEach ...它是如何工作的?
下面的代码有错误 - >File Is In Use
Parallel.ForEach(list_lines_acc, (line_acc, list_lines_acc_state) =>
{
FileStream file =
new FileStream(GPLfilePath, FileMode.Open, FileAccess.ReadWrite);
StreamReader reader = new StreamReader(file);
var processed = string.Empty;
Ok_ip_port = string.Empty;
while (reader.EndOfStream)
{
if (string.IsNullOrEmpty(Ok_ip_port))
{
Ok_ip_port = reader.ReadLine();
}
else
{
string currentLine = reader.ReadLine();
processed += currentLine + Environment.NewLine;
}
}
StreamWriter writer = new StreamWriter(file);
writer.Write(processed);
reader.Close();
writer.Close();
file.Close();
});
Run Code Online (Sandbox Code Playgroud)
你能告诉我怎样才能解决这个问题?这段代码只是一个例子.
我想在Parallel.ForEach中使用字符串数组和列表,但是添加或编辑这些集合总是存在问题.你能举个例子吗?我使用的是Visual Studio 2010 + .NET Framework 4.0
例
var options = new ParallelOptions()
{
MaxDegreeOfParallelism = 10
};
List<string> lstAllUrls = File.ReadAllLines("myList.txt").ToList<string>();
Parallel.ForEach(lstAllUrls, options, myFunctionThatFetchPage);
Run Code Online (Sandbox Code Playgroud)
现在这完全没问题.我想知道的是:我怎么知道我目前在哪个迭代.我的意思是说我的列表有100000个URL.它开始取出它们.但我还想在屏幕上打印当前正在获取URL的内容.
我怎样才能做到这一点?如何判断循环当前在给定列表的哪个项目?
我有一个像这样的场景
int arr[100];
Parallel.Foreach(arr, (a) => { some processing});
Run Code Online (Sandbox Code Playgroud)
现在,这段代码将生成100个子线程,如何在"某些处理"逻辑中知道每个子线程的线程id.
我是Parallel.ForEach第一次使用,我正在处理文件;在 WinForms 应用程序的上下文中。
根据其他线程对此编码问题(Parallel.ForEach 进度报告)的指导,我的类中有一个 public (int) counter 属性,其中包含并行代码,并且它正在成功更新;我的表单上还有一个 Timer 可以定期读取计数器。
问题是,当我执行并行代码时,可见进度更新似乎停止,然后在并行代码完成后立即开始。
仅供参考 - 我直接调用并行代码 - 也就是说,不是通过后台工作程序或异步方法。
我有一个包含2个列表框的程序,这个程序是基于搜索文件,然后比较StopWatch使用AsyncAwait和TPL 的区别...第一个列表框使用的功能 AsyncAwait(我不知道它是否更好的方式但它有效,请参阅下面的代码)
private async void button1_Click(object sender, EventArgs e)
{
Stopwatch stopWatch = new Stopwatch();
foreach (string d in Directory.GetDirectories(@"C:\Visual Studio Projectes\Hash\AsyncAwait\Carpetes"))
{
foreach (string s in Directory.GetFiles(d))
{
stopWatch.Start();
listBox1.Items.Add(s);
await Task.Delay(1);
btIniciar1.Enabled = false;
}
}
btIniciar1.Enabled = true;
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
textBox1.Text = ts.ToString("mm\\:ss\\.ff") + (" minuts");
}
Run Code Online (Sandbox Code Playgroud)
然后在我的第二个列表框在那里我坚持,我不知道如何实现Parallel.ForEach对像async,有什么更好的方式来做到这一点?在这种情况下我找不到使用TPL的方法和我的第一个列表框一样,你能帮帮我吗?
我们在代码中广泛使用了Parallel.Foreach,我们唯一的挑战是如何在DEBUG模式下使用可视调试使其成为串行,以下是我们正在做的,请分享您的观点:
public static class ParallelOptionsWrapper
{
// Private instance of ParallelOptions
private static readonly ParallelOptions @ParallelOptions;
// Private constructor
static ParallelOptionsWrapper()
{
@ParallelOptions = new ParallelOptions();
#if DEBUG
// 1 is sequential
@ParallelOptions.MaxDegreeOfParallelism = 1;
#else
// -1 is unlimited
@ParallelOptions.MaxDegreeOfParallelism = -1;
#endif
}
public static ParallelOptions Instance() { return @ParallelOptions; }
}
Run Code Online (Sandbox Code Playgroud)
以下是用法:
Parallel.ForEach(EnumerableList, ParallelOptionsWrapper.Instance(), element =>
{
// Code to run in Parallel
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,所有Parallel.Foreach调用都具有ParallelOptions的相同实例,在我看来应该没问题.
这样安全吗?这有效吗?
c# parallel-processing multithreading task-parallel-library parallel.foreach
我有一个ConcurrentQueue,其中包含需要获取其来源的URL列表。当将Parallel.ForEach与ConcurrentQueue对象用作输入参数时,Pop方法将无效(应返回一个字符串)。
我使用MaxDegreeOfParallelism设置为四个的Parallel。我真的需要阻止并发线程的数量。使用具有并行性的队列是否多余?
提前致谢。
// On the main class
var items = await engine.FetchPageWithNumberItems(result);
// Enqueue List of items
itemQueue.EnqueueList(items);
var crawl = Task.Run(() => { engine.CrawlItems(itemQueue); });
// On the Engine class
public void CrawlItems(ItemQueue itemQueue)
{
Parallel.ForEach(
itemQueue,
new ParallelOptions {MaxDegreeOfParallelism = 4},
item =>
{
var worker = new Worker();
// Pop doesn't return anything
worker.Url = itemQueue.Pop();
/* Some work */
});
}
// Item Queue
class ItemQueue : ConcurrentQueue<string>
{
private ConcurrentQueue<string> queue = new ConcurrentQueue<string>(); …Run Code Online (Sandbox Code Playgroud) 我在C#控制台应用程序中使用Parallel.ForEach,但似乎无法正确使用它.我正在创建一个包含随机数的数组,我有一个连续的foreach和一个找到数组中最大值的Parallel.ForEach.使用c ++中大致相同的代码,我开始看到在数组中使用3M值的多个线程的权衡.但即使在100M值下,Parallel.ForEach也是两倍慢.我究竟做错了什么?
class Program
{
static void Main(string[] args)
{
dostuff();
}
static void dostuff() {
Console.WriteLine("How large do you want the array to be?");
int size = int.Parse(Console.ReadLine());
int[] arr = new int[size];
Random rand = new Random();
for (int i = 0; i < size; i++)
{
arr[i] = rand.Next(0, int.MaxValue);
}
var watchSeq = System.Diagnostics.Stopwatch.StartNew();
var largestSeq = FindLargestSequentially(arr);
watchSeq.Stop();
var elapsedSeq = watchSeq.ElapsedMilliseconds;
Console.WriteLine("Finished sequential in: " + elapsedSeq + "ms. Largest = " + largestSeq); …Run Code Online (Sandbox Code Playgroud) 我已经读过在ASP.NET Web应用程序中使用Task.Run是一个坏主意,因为它使用来自线程池的另一个线程,因此阻止这个特定的线程用于提供请求.
Parallel.ForEach的情况不一样吗?它是否会使用线程池中的多个线程,从而阻止这些特定线程用于提供请求?
c# asp.net task-parallel-library async-await parallel.foreach
parallel.foreach ×10
c# ×9
async-await ×2
winforms ×2
.net ×1
asp.net ×1
file ×1
read-write ×1
timer ×1