Tag: multithreading

如何使用线程或计时器从WPF客户端应用程序定期执行方法

我正在开发一个WPF客户端应用程序。这个应用程序定期向webservice发送数据。 当用户登录应用程序时,我希望每5 mts运行特定方法将数据发送到.asmx服务。 我的问题是我是否需要使用线程或计时器。这个方法执行应该在用户与应用程序交互时发生。 即在此方法执行期间不阻止UI 要查找的资源是什么?

WPF在单独的UI线程上加载动画? (C#)

好的,我有一个加载动画,在填充大型DataTable时运行,让用户知道程序没有冻结。 我有动画工作正常,但它也冻结了DataTable也在更新。 有没有办法拥有多个UI线程,以便在DataTable加载信息时动画将继续运行? 编辑:当前代码如下。 private void CreateFileTable() { file_data = new DataSet(); data_table = new DataTable(); file_data.Tables.Add(data_table); DataColumn tempCol = new DataColumn(“File Name”, typeof(string)); data_table.Columns.Add(tempCol); tempCol = new DataColumn(“Ext”, typeof(string)); data_table.Columns.Add(tempCol); tempCol = new DataColumn(“Size”, typeof(string)); data_table.Columns.Add(tempCol); tempCol = new DataColumn(“Created”, typeof(Label)); data_table.Columns.Add(tempCol); tempCol = new DataColumn(“Modified”, typeof(Label)); data_table.Columns.Add(tempCol); tempCol = new DataColumn(“Accessed”, typeof(Label)); data_table.Columns.Add(tempCol); […]

处理来自托管STA应用程序中的进程外COM服务器的事件

显然,来自非托管进程外COM服务器的事件的托管处理程序在随机池线程上调用,而不是在主STA线程上调用(正如我所期望的那样)。 我在回答有关Internet Explorer自动化的问题时发现了这一点。 在下面的代码中, DocumentComplete在非UI线程上触发(因此”Event thread”与调试输出中的”Main thread” )。 因此,我必须使用this.Invoke来显示一个消息框。 据我所知,此行为与非托管COM客户端不同,其中从STA线程订阅的事件会自动编组回同一个线程。 这种背离传统COM行为背后的原因是什么? 到目前为止,我还没有找到任何证实这一点的参考文献。 using System; using System.Diagnostics; using System.Threading; using System.Windows.Forms; namespace WinformsIE { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs ev) { var ie = (SHDocVw.InternetExplorer)Activator.CreateInstance(Type.GetTypeFromProgID(“InternetExplorer.Application”)); ie.Visible = true; Debug.Print(“Main thread: {0}”, Thread.CurrentThread.ManagedThreadId); ie.DocumentComplete += […]

了解C#5 async / await中的上下文

我是否正确async / await本身与并发/并行无关,只不过是继续传递样式(CPS)实现? 真正的线程是由await传递/恢复的SynchronizationContext实例执行的? 如果这是正确的,我有关于SynchronizationContext的以下问题: 它保证在同一个线程上执行延续。 但是,是否有任何保证线程的上下文信息是持久的? 我的意思是Name , CurrentPrincipal , CurrentCulture , CurrentUICulture等。它依赖于框架(ASP.NET,WinForms,WCF,WPF)吗?

多个UI线程 – Winforms

我想在我的应用程序中创建多个UI线程。 我已经模拟了如下方案。 我在后台线程中单击按钮创建一个新窗口/表单 namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var thread = new Thread(() => { Form f = new Form(); Application.Run(f); }); // thread.IsBackground = true; — Not required. See Solution below thread.SetApartmentState(ApartmentState.STA); thread.Start(); } } } 请注意 […]

生成一个新线程以打开一个新窗口并从另一个线程关闭它

现在我有C#代码在不同的线程中生成一个新窗口,这是有效的,但是一旦新生成的窗口打开,它就会关闭并且线程结束。 我如何制作它以便可以从第一个线程关闭新生成的窗口? 这是产卵目前如何运作的“树”: 主线程 – 在主线程中使用一个函数在另一个线程中启动另一个函数来打开w窗口,导致窗口使用该线程。 基本上我只想让每个窗口都有自己的线程。 并能够从第一个窗口线程控制生成的辅助窗口。

如何依靠I / O大量正确地并行工作

我正在构建一个必须处理大量数据的控制台应用程序。 基本上,应用程序从数据库中获取引用。 对于每个引用,解析文件的内容并进行一些更改。 这些文件是HTML文件,并且该过程正在使用RegEx替换进行繁重的工作(查找引用并将它们转换为链接)。 然后将结果存储在文件系统中并发送到外部系统。 如果我按顺序恢复该过程: var refs = GetReferencesFromDB(); // ~5000 Datarow returned foreach(var ref in refs) { var filePath = GetFilePath(ref); // This method looks up in a previously loaded file list var html = File.ReadAllText(filePath); // Read html locally, or from a network drive var convertedHtml = ParseHtml(html); File.WriteAllText(destinationFilePath); // Copy the […]

多个生产者,单个消费者

我必须开发一个multithreading应用程序,其中将有多个线程,每个线程生成自定义事件日志并需要保存在队列中保存(不是微软MSMQ)。 将有另一个线程从队列中读取日志数据并使用某些信息对其进行操作以将日志信息保存到文件中。基本上,我们在这里实现多个生成器单个消费者范例。 任何机构都可以建议我如何在C ++或C#中实现它。 谢谢,

返回Task的接口的同步实现

类似于在同步代码中实现需要Task返回类型的接口,虽然我很好奇我是否应该忽略编译器错误,而是我的情况生成。 假设我有这样的界面: public interface IAmAwesome { Task MakeAwesomeAsync(); } 在某些实现中,使用async和await async完成可以带来很多好处。 这实际上是接口试图允许的内容。 在其他情况下,也许很少见,只需要一个简单的同步方法来制作真棒。 所以让我们假设实现如下: public class SimplyAwesome : IAmAwesome { public async Task MakeAwesomeAsync() { // Some really awesome stuff here… } } 这有效,但编译器警告: 这种方法缺少’await’运算符并将同步运行。 考虑使用await运算符等待非阻塞API调用,或者’await TaskEx.Run(…)’在后台线程上执行CPU绑定工作。 编译器实际上是在建议这个解决方案: public class SimplyAwesome : IAmAwesome { public async Task MakeAwesomeAsync() { await Task.Run(() => { // Some […]

使用.Net HttpListener进行multithreading处理

我有一个听众: listener = new HttpListener(); listener.Prefixes.Add(@”http://+:8077/”); listener.Start(); listenerThread = new Thread(HandleRequests); listenerThread.Start(); 我正在处理请求: private void HandleRequests() { while (listener.IsListening) { var context = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener); context.AsyncWaitHandle.WaitOne(); } } private void ListenerCallback(IAsyncResult ar) { var listener = ar.AsyncState as HttpListener; var context = listener.EndGetContext(ar); //do some stuff } 我想以这样的方式写出void Stop() : 它将阻塞,直到所有当前处理的请求结束(即等待所有线程“执行某些操作”)。 虽然它将等待已经启动的请求,但它将不允许任何更多的请求(即在ListenerCallback的开头返回)。 之后它将调用listener.Stop() ( […]