Tag: multithreading

为什么不在构造函数中启动线程? 如何终止?

我正在学习如何在Java中使用线程。 而且我写了一个实现Runnable并行运行到另一个线程的类。 主线程处理侦听串口,第二个线程将处理发送数据到同一端口。 public class MyNewThread implements Runnable { Thread t; MyNewThread() { t = new Thread (this, "Data Thread"); t.start(); } public void run() { // New Thread code here } 有第一个线程启动第二个像这样: public class Main { public static void main(String[] args) throws Exception{ new MyNewThread(); // First thread code there } } 这工作,但我的编译器标志警告说:在构造函数中启动一个新的线程是危险的。 为什么是这样? […]

使用Dispatcher.Invoke从非主线程更改WPF控件

我最近开始在WPF编程,碰到以下问题。 我不明白如何使用Dispatcher.Invoke()方法。 我有线程的经验,我已经做了一些简单的Windows窗体程序,我刚刚使用 Control.CheckForIllegalCrossThreadCalls = false; 是的,我知道这是很蹩脚的,但这些都是简单的监控应用程序。 事实上,现在我正在做一个WPF应用程序,在后台检索数据,我开始一个新的线程,使调用检索数据(从networking服务器),现在我想显示在我的WPF表单。 事情是,我不能从这个线程设置任何控制。 甚至没有标签或任何东西。 这怎么解决? 回答评论: @Jalfp: 所以当我得到这些数据的时候,我在“新步伐”中使用了这个Dispatcher方法? 或者,我应该让一个后台工作人员检索数据,把它放到一个字段,并开始一个新的线程,等待这个字段填充,并呼吁调度员显示检索到的数据到控制?

C#线程真的可以caching一个值,并忽略其他线程上的值的变化吗?

这个问题不是关于种族条件,primefaces性,或为什么你应该在你的代码中使用锁。 我已经知道这些。 更新:我的问题不是“是否存在易失性内存的古怪”(我知道它的确如此),我的问题是“.NET运行时不会抽象出来,所以你永远不会看到它”。 请参阅http://www.yoda.arachsys.com/csharp/threads/volatility.shtml和第一个答案是string属性本身threadsafe? (他们真的是相同的文章,因为一个引用另一个。)一个线程设置一个布尔和另一个线程永远循环阅读该布尔 – 这些文章声称阅读线程可能会caching旧值,从来没有读取新值,所以因此您需要locking(或使用volatile关键字)。 他们声称以下代码可能会永久循环。 现在我同意locking你的variables是一个很好的习惯,但是我不能相信.NET运行库会真正忽略一个随着文章的声明而改变的内存值。 我理解他们对易失性存储器和非易失性存储器的讨论,我同意他们在非托pipe代码中有一个有效的观点,但我不能相信.NET运行时将不会正确地抽象出来,以便下面的代码你期望什么 文章甚至承认代码将“几乎肯定”的工作(虽然不能保证),所以我打电话给BS的索赔。 任何人都可以validation它是真的下面的代码不会总是工作? 任何人都可以得到一个案例(也许你不能总是重现),哪里有失败? class BackgroundTaskDemo { private bool stopping = false; static void Main() { BackgroundTaskDemo demo = new BackgroundTaskDemo(); new Thread(demo.DoWork).Start(); Thread.Sleep(5000); demo.stopping = true; } static void DoWork() { while (!stopping) { // Do something here } } }

并发HttpWebRequest的最大数目

我正在testing一个web应用程序的压力,并build立了一个windowstesting程序,它可以激活多个线程并发送一个web请求。 问题是我得到以下输出: 01/09/09 11:34:04 Starting new HTTP request on 10 01/09/09 11:34:04 Starting new HTTP request on 11 01/09/09 11:34:04 Starting new HTTP request on 13 01/09/09 11:34:05 Starting new HTTP request on 14 01/09/09 11:34:05 Starting new HTTP request on 11 01/09/09 11:34:05 11 has finished! 01/09/09 11:34:05 Starting new HTTP request on 13 […]

列表是线程安全的

我注意到它经常被build议使用带有多个排队的队列,而不是列表和.pop()。 这是因为列表不是线程安全的,还是其他原因?

何时使用Task.Delay,何时使用Thread.Sleep?

有什么时候使用Task.Delay与Thread.Sleep的好规则? 具体来说,是否有一个最低的价值来提供一个是有效的/高效率的? 最后,由于Task.Delay在asynchronous/等待状态机上导致上下文切换,是否有使用它的开销?

处理来自Java ExecutorService任务的exception

我正在尝试使用Java的ThreadPoolExecutor类来运行具有固定数量的线程的大量重量级任务。 每个任务都有很多地方可能由于例外而失败。 我已经子类ThreadPoolExecutor ,我已经重写了afterExecute方法应该提供任何运行任务时遇到的未捕获的exception。 但是,我似乎无法使其工作。 例如: public class ThreadPoolErrors extends ThreadPoolExecutor { public ThreadPoolErrors() { super( 1, // core threads 1, // max threads 1, // timeout TimeUnit.MINUTES, // timeout units new LinkedBlockingQueue<Runnable>() // work queue ); } protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); if(t != null) { System.out.println("Got an error: " […]

如何正确closuresjava的ExecutorService

我有一个简单的Java ExecutorService运行一些任务对象(实现Callable )。 ExecutorService exec = Executors.newSingleThreadExecutor(); List<CallableTask> tasks = new ArrayList<>(); // … create some tasks for (CallableTask task : tasks) { Future future = exec.submit(task); result = (String) future.get(timeout, TimeUnit.SECONDS); // TASKS load some classes and invoke their methods (they may create additional threads) // … catch interruptions and timeouts } exec.shutdownNow(); 所有任务完成后(DONE或TIMEOUT-ed),我尝试closures执行程序,但不会停止: […]

WinForm应用程序UI在长时间运行期间挂起

我有一个Windows窗体应用程序,我需要使用for循环有大量的远程调用2000 – 3000调用, 在执行for循环的时候,我放弃了对form和form控件的控制,因为它变成了一个很大的进程,有时它显示“Not Responding”,但是如果等待很长时间,它会再次返回,我想我需要使用有一些线程模型,有什么想法,我怎么才能着手解决这个问题?

调用线程必须是STA,因为许多UI组件都需要这个

我正在使用http://www.codeproject.com/KB/IP/Facebook_API.aspx 我正在尝试调用使用WPF创build的XAML 。 但它给了我一个错误: 调用线程必须是STA,因为许多UI组件都需要这个。 我不知道该怎么办。 我正在尝试这样做: FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 但它给了我这个错误。 我添加了一个后台工作者: static BackgroundWorker bw = new BackgroundWorker(); static void Main(string[] args) { bw.DoWork += bw_DoWork; bw.RunWorkerAsync("Message to worker"); Console.ReadLine(); } static void bw_DoWork(object sender, DoWorkEventArgs e) { // This is called on the worker thread FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); Console.WriteLine(e.Argument); // […]