Tag: multithreading

为什么在从我的网络应用转换video时ffmpeg永远不会完成?

我想在用户提交表单时转换video。 它似乎转换正常,但当我尝试用它做任何事情时,文件“正被另一个进程使用”。 看起来ffmpeg.exe永远不会退出。 我的代码在下面是否有任何我应该做的不同以允许进程释放文件? 如果我手动运行它退出正常。 internal class ConversionUtility : Utility { public void Convert(string videoFileName) { var video = new VideoFile(videoFileName); if (!video.infoGathered) GetVideoInfo(video); var Params = string.Format(“-y -i \”{0}\” -coder ac -me_method full -me_range 16 -subq 5 -sc_threshold 40 -vcodec libx264 -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -i_qfactor 0.71 -keyint_min 25 -b_strategy 1 -g 250 -r […]

如何正确等待调用Dispatcher.Invoke的多个线程在WPF应用程序中完成

我有一个WPF应用程序启动3个线程,需要等待它们完成。 我在这里阅读了许多处理此问题的post,但似乎没有解决线程代码调用Dispatcher.Invoke或Dispatcher.BeginInvoke的情况。 如果我使用线程的Join()方法或ManualResetEvent,则线程会在Invoke调用上阻塞。 这是一个似乎有效的丑陋解决方案的简化代码片段: class PointCloud { private Point3DCollection points = new Point3DCollection(1000); private volatile bool[] tDone = { false, false, false }; private static readonly object _locker = new object(); public ModelVisual3D BuildPointCloud() { … Thread t1 = new Thread(() => AddPoints(0, 0, 192)); Thread t2 = new Thread(() => AddPoints(1, 193, 384)); Thread […]

杀死一个线程

我正在处理的项目中有以下代码片段: public void Start() { Thread t = new Thread(NotifyIfNecessary); Threads.Add(t); t.Start(); t.Abort()); } 我想要的是线程’t’应该执行方法NotifyIfNecessary并且只在方法完成执行后才中止。 在我当前的代码中,t.Abort()被过早调用。

同步控制台应用程序中不同线程的事件

我感觉像是一个总的菜鸟问这个,但无论如何,它在这里: 我想知道从不同线程同步事件的最简单方法是什么。 一些示例代码: class Program { static void Main(string[] args) { Console.WriteLine(“# started on:” + Thread.CurrentThread.ManagedThreadId); tt t = new tt(); t.First += new EventHandler(t_First); t.Second += new EventHandler(t_Second); Task task = new Task(new Action(t.Test)); task.Start(); while (true) { Console.ReadKey(); Console.WriteLine(“# waiting on:” + Thread.CurrentThread.ManagedThreadId); } } static void t_Second(object sender, EventArgs e) { Console.WriteLine(“- […]

创建线程时出现NullReferenceException

我正在看这个线程创建一个简单的线程池。 在那里,我遇到了@ MilanGardian对.NET 3.5的回应,它很优雅并且符合我的目的: using System; using System.Collections.Generic; using System.Threading; namespace SimpleThreadPool { public sealed class Pool : IDisposable { public Pool(int size) { this._workers = new LinkedList(); for (var i = 0; i 0) { Monitor.Wait(this._tasks); } this._disposed = true; Monitor.PulseAll(this._tasks); // wake all workers (none of them will be active at this point; […]

中止以Delegate.BeginInvoke开头的线程

免责声明 :我知道Thread.Abort是邪恶的。 我使用它作为最后的手段,因为一些I / O函数(例如,在不存在的网络共享上使用File.Exists )会阻塞大量的时间,并且不允许您指定超时。 问题 :是否可以使用Delegate.BeginInvoke中止工作线程(如在Thread.Abort )或者我是否必须自己进行线程处理?

为什么我的ASP.NET站点采用单线程?

我有一个在IIS中运行的ASP.NET站点,我注意到如果一个页面很慢,似乎运行缓慢,所以我设置了一个测试,看它是否正在运行,好像它是一个单独的线程(即,如果一个页面请求正在运行,所有其他人必须等待)。 我创建了一个非常简单的页面(没有母版页,只有默认的aspx代码,除了我添加了一个Literal来转储调试代码),代码读取当前时间,睡眠10秒,然后退出,如下所示: protected void Page_Load(object sender, EventArgs e) { DateTime now = DateTime.Now; System.Threading.Thread.Sleep(10000); Literal1.Text = now.ToShortDateString() + ” ” + now.ToShortTimeString() + ” ” + now.Second + “:” + now.Millisecond; } 然后我同时在两个不同的选项卡中打开页面。 每个选项卡上的时间戳几乎相隔10秒,这在我看来意味着第二个页面请求被阻止并等待第一个页面请求在运行之前完成。 我尝试在web.config中注释掉所有的http模块并禁用Global.asax中的所有代码,但我仍然看到这个问题。

我们可以使用Parallel.ForEach()将新元素添加到列表中吗?

我的代码做的很简单 列表已经有元素。 我在列表中有大约25000个元素(我希望有更多元素),每个元素都很小(DateTime)。 List newList = new List(); Parallel.ForEach(list, l => newlist.Add(new DateTime(l.Ticks + 5000))); 也就是说,基于每个元素,我正在创建新元素并将它们添加到不同的列表中。 但是,这似乎不是一个好的编程方法。 我有时会遇到这种exception,但不是每次都这样。 IndexOutOfRangeException : {“Index was outside the bounds of the array.”} 我们可以使用Parallel.ForEach()将元素添加到列表中吗? 如果是,为什么我会遇到错误? 如果不是,为什么?

System.Data.Entity.Infrastructure.CommitFailedException:C#Multithreading&SQL Server 2012

我们有一个C#multithreading(100线程)程序,它从数据库中读取记录,每个线程获取一条记录(每个线程一个entity framework连接)并更新单个数据库表。 在最初的几分钟(5分钟)内,程序运行正常,然后突然所有线程都开始抛出以下错误消息。大约1分钟后一切都会恢复正常阶段..我认为SQL Server也是如此单个数据库表的许多锁(可能试图获取该表上的表锁)或与单个数据库的连接太多并关闭所有连接。 我无法调试此问题,有人可以帮助我获取以下信息, SQL Server 2012在哪里存储其日志? 我们是否可以增加日志级别以查看在保存数据库实体时它抛出exception的原因 如何获取每个表的锁数,DB获取的不同类型的锁(表锁,页锁,num行锁等) 任何其他指针来调试此问题。 仅供参考,我从sqdror日志中找不到任何有用的东西(SELECT SERVERPROPERTY(’ErrorLogFileName’)) 这是exception的堆栈跟踪 System.Data.Entity.Infrastructure.CommitFailedException:提交数据库事务时报告了错误,但无法确定数据库服务器上的事务是成功还是失败。 有关详细信息,请参阅内部exception和http://go.microsoft.com/fwlink/?LinkId=313468 。 System.Data.SqlClient.SqlException:超时已过期。 操作完成之前经过的超时时间或服务器没有响应。 System.ComponentModel.Win32Exception:等待操作超时 在System.Data.SqlClient.SqlInternalConnection.OnError(SqlExceptionexception,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer() at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject […]

使用Parallel.ForEach()时防止远程系统过载

我们已经构建了这个需要在远程机器(实际上是MatLab服务器)上完成一些计算的应用程序。 我们使用Web服务连接到MatLab服务器并执行计算。 为了加快速度,我们使用了Parallel.ForEach() ,以便同时进行多个服务调用。 如果我们将ParallelOptions.MaxDegreeOfParallelism (DOP)设置为4或者其他东西非常保守,那么一切都运行良好。 但是,如果我们让框架决定DOP,它将产生如此多的线程,迫使远程机器跪下并开始超时(> 10分钟)。 我们如何解决这个问题? 我能够做的就是使用响应时间来限制呼叫。 如果响应时间小于30秒,请继续添加线程,一旦超过30秒,请使用更少的线程。 有什么建议? NB与此问题中的响应相关: https : //stackoverflow.com/a/20192692/896697