Tag: multithreading

使用Thread.Sleep()时Wpf标签未更新

我有一个标签我想在每秒后更新的内容,3秒后我只看到最后一个字符串“第3步……”我做错了什么,如果出于某种原因还有另一种方法来实现这一点我不能使用Thread.Sleep(): 视图: 查看型号: using System.Collections.ObjectModel; using System.ComponentModel; using System.Threading; namespace WpfApplication1.Scroller { public class Message { public Message(string _text) { text = _text; } private string text; public string Text { get { return text; } set {text = value;} } } public class ScrollerViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public DelegateCommand AddNew […]

总是可以使用Task强制新线程吗?

我试图在每次调用Task.Factory.StartNew时创建一个新线程。 问题是如何在不抛出exception的情况下运行代码: static void Main(string[] args) { int firstThreadId = 0; Task.Factory.StartNew(() => firstThreadId = Thread.CurrentThread.ManagedThreadId); for (int i = 0; i { while (true) { Thread.Sleep(1000); if (firstThreadId == Thread.CurrentThread.ManagedThreadId) throw new Exception(“The first thread is reused.”); } }); } Console.Read(); } 编辑:新代码,如果你评论第一个语句没有问题。 但是,如果你拥有它,WOW,“Thread reused”消息将被写入控制台。 你能解释一下,因为我真的很困惑。 static void Main(string[] args) { ConcurrentDictionary startedThreads = […]

Directshow过滤访问线程

我使用directshowlib-2005在c#中制作了一个电视播放器。 现在我做了一个搜索可用频道的方法。 我希望这个方法在不同的线程中运行,所以我的GUI不会冻结,但是当我尝试在方法中设置通道时出现错误。 它在我的图表中找不到IAMTVTuner界面,尽管我知道它在那里。 如果我不使用不同的线程,该方法工作正常(但我的GUI冻结了一段时间) 我知道它必须对公寓做一些事情,但有没有办法可以在不同的线程中访问该界面,然后创建我的图形的线程?

使用Winforms中的运行后台线程更新UI中的控件

我在Winform中使用Background Worker Thread,在我的Do_Work事件中我正在计算一些东西,我需要的是同时我想更新一个在main / UI线程中的标签? 怎么实现这个? 我想从Do_Work事件中更新我的标签……

async和await是否会提高ASP.Net应用程序的性能

我最近阅读了一篇关于c#-5和新的和漂亮的异步编程function的文章。 我看到它在Windows应用程序中运行很好。 问题来了我是否这个function可以提高ASP.Net性能? 考虑这两个psudo代码: public T GetData() { var d = GetSomeData(); return d; } 和 public async T GetData2() { var d = await GetSomeData(); return d; } 在ASP.Net中有两个代码区别吗? 谢谢

启动和停止(强制)线程作业

我想知道一种正确的方法来启动和停止强制和非强制的线程作业。 这是停止线程的正确方法吗? public class ProcessDataJob : IJob { private ConcurrentQueue _dataQueue = new ConcurrentQueue(); private volatile bool _stop = false; private volatile bool _forceStop = false; private Thread _thread; private int _timeOut = 1000; public void Start() { _stop = false; _forceStop = false; _thread = new Thread(ProcessData); _thread.Start(); } private void ProcessData() { while […]

监视套接字以获取新数据然后处理该数据的最佳方法是什么?

请原谅我的C#.Net新手状态。 如果这是显而易见的并且我从文档中错过了它,那么将会感谢指向相关页面或示例代码的链接。 我正在开发一个应用程序,它将接受来自Java应用程序的TCP套接字连接。 (是的,那部分需要Java。它是Sun SPOT设备,Java是唯一的选择。)Java应用程序将定期将新数据写入套接字,而我的应用程序的工作是接收byte [],转换它是一个字符串,处理数据(更新UI等),并可能将数据转发到另一台运行类似C#.NET应用程序的计算机上。 以下是我到目前为止所做的事情:现在,应用程序在启动时旋转了一个打开套接字的线程。 Java应用程序可以成功连接到套接字,以便正常工作。 我正在查看NetworkStream的beginRead方法以及dataAvailable , length和CanRead属性,但我不完全确定如何确定何时读取一个数据包,通常大约512个字节但可能会有所不同。 如果Java应用程序将数据写入流或存在积压的数据(Java应用程序将快速传递数据。)如何确保我一次只读取一个数据包? 如果Java应用程序null在写入时终止数据,那会有帮助吗? 够了吗? 最后,套接字只接收一个连接,但我需要保持打开,直到出现错误或连接终止。 处理这方面最优雅的方法是什么? 我不认为关闭并重新打开每个数据包将起作用,因为在Sun SPOT基站上运行的Java应用程序的快速火灾(几乎实时)方面。 现在,当基站终止时,我的应用程序死于大声而痛苦的死亡。 🙂 感谢您阅读并提供任何帮助。

如何使用带有计时器滴答的BackgroundWorker?

决定不使用任何计时器。 我做的更简单。 添加了一个后台工作者。 在加载了所有构造函数后,添加了一个Shown事件,显示事件触发。 在Shown事件中,我启动了backgroundworker异步。 在后台工作者DoWork我做: private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { while(true) { cpuView(); gpuView(); Thread.Sleep(1000); } }

取消令牌的任务?

鉴于取消令牌,我想创建一个等待它的任务,这是永远不会完成但可以取消。 我需要这样的模式,IMO应该很常见: async Task DoStuff(Task t, CancellationToken ct) { // t was made from TaskCompletionSource, // both t and ct are beyond my control Task t2 = TaskFromCancellationToken(ct); await Task.WhenAny(t, t2); // do stuff } 我到目前为止最好的想法是: Task TaskFromCancelationToken(CancellationToken ct) { return Task.Delay(Timeout.Infinite, ct); } 是否有更好的方法来实现这种逻辑?

从任务返回而不阻止UI线程

我有一个返回数据表的方法。 我需要在线程中运行所有sql东西,然后能够传回一个数据表,而不会阻塞UI线程。 根据我的理解,当您调用Task.Result时,它会阻止UI线程,直到任务完成。 我该如何解决这个问题。 我读到了关于使用await和async的问题,但我还没有弄清楚如何在任务中使用它。 public static DataTable LaunchLocationMasterListReport(ObservableCollection BuiltConditionsList, ObservableCollection BuiltSortList, ObservableCollection ColumnsForReport, bool LocationNotesCheckBox, ref string reportQuery, ref string reportQueryforSave, ref string reportView, ref string queryCondtions) { queryCondtions = BuildConditionAndSorts(queryCondtions, BuiltConditionsList, BuiltSortList); reportQueryforSave = “SELECT * FROM LocationMasterReportView”; reportView = “LocationMasterReportView”; reportQuery = “SELECT * FROM LocationMasterReportView ” + queryCondtions; return LaunchReport(reportQuery, ColumnsForReport).Result; […]