Tag: multithreading

C#从线程中调用的函数返回值

我有一个计算线程函数,它使用Invoke从其他线程调用消息函数,我希望计算线程从该消息函数获取值(值类型,如整数)。 我怎样才能做到这一点? 问题是我在Invoke(…)之后仍然得到x变量的旧值,我期望值为15 delegate void mes_del(object param); void MyThreadFunc() { … int x = 5; object [] parms = new object []{x}; Invoke(new mes_del(MessageFunc), (object)parms); … } void MessageFunc(object result) { int res = 15; (result as object[])[0] = res; } 我尝试了一些方法,比如使用object [],object作为参数但没有成功。 我虽然拳击/拆箱操作应该在这种情况下发生,但他们不会。 我是否应该像在.NET事件模式中那样使用辅助类型,并创建像类holder {public int x; }

从多个线程渲染到单个Bitmap对象

我正在做的是将多个位图呈现给单个位图。 可能有数百个图像,并且渲染的位图可能超过1000×1000像素。 我希望通过使用多个线程来加快这个过程,但由于Bitmap对象不是线程安全的,因此它不能直接同时呈现。 我想的是将大位图分成每个cpu的部分,分别渲染它们然后在最后将它们连接在一起。 我还没有这样做,但是你们/女孩们有更好的建议。 有任何想法吗? 谢谢

如何异步加载和显示图像

我是WPF的新手,但我已经做了很长一段时间的C#,我目前正在开发一个简单的窗口(Windows桌面),它应该可视化目录中的所有照片。 应用程序还应该知道我使用DLL的EXIF数据,如ISO,光圈等。 我已经定义了一个Photo类: public class Photo { public string FileName { get; set; } public int ISO { get; set; } … } 我想在运行时存储在List中。 然后我宣布了一个带有Image控件和TextBlock的PhotoItem (XAML用户控件)。 对于创建的每张Photo ,将创建一个PhotoItem ,将相应的Photo保存为属性: public partial class PhotoItem : UserControl { … public Photo Photo { get; set; } … } 从这个Photo属性, PhotoItem知道在哪里查找图像以及要显示的ISO等。 现在我的问题。 因为如果用户选择目录,加载Image本身以及元数据将花费太长时间,我想首先将所有PhotoItem添加到窗口(仍为空),然后运行元数据查找和图像缩略图加载他们每个人。 当然最好是这些操作不会阻止UI线程,因此我目前正在使用一个Task来收集元数据,一个用于收集缩略图。 如果图像的元数据现在可用,我将如何更新PhotoItems? 基本上,您如何拥有一个存储所有数据的集中位置,任务可以向其提供更新,UI线程可以从中创建信息。 我对XAML / […]

用C#中的每个新线程打开一个新的控制台?

我希望每当我创建一个新线程时都会打开一个新的控制台,以便组织输出。 我的应用程序完全基于控制台。 如果是这样的话会有可能吗? 问候!

重用BackgroundWorker,取消并等待它

假设您有一个搜索文本框并且具有附加到TextChanged事件的搜索算法,该事件与BackgroundWorker一起运行。 如果文本框中出现了新字符,我需要取消之前的搜索并再次运行。 我尝试在主线程和bgw之间使用事件, 从前一个问题 ,但我仍然得到错误“当前很忙,不能同时运行多个任务” BackgroundWorker bgw_Search = new BackgroundWorker(); bgw_Search.DoWork += new DoWorkEventHandler(bgw_Search_DoWork); private AutoResetEvent _resetEvent = new AutoResetEvent(false); private void txtSearch_TextChanged(object sender, EventArgs e) { SearchWithBgw(); } private void SearchWithBgw() { // cancel previous search if (bgw_Search.IsBusy) { bgw_Search.CancelAsync(); // wait for the bgw to finish, so it can be reused. _resetEvent.WaitOne(); // […]

InvalidOperationException:调用线程无法访问此对象,因为另一个线程拥有它。

可能重复: 调用线程无法访问此对象,因为另一个线程拥有它 错误: The calling thread cannot access this object because a different thread owns it. 码: public partial class MainWindow : Window { Thread t; bool interrupt; public MainWindow() { InitializeComponent(); } private void btss_Click(object sender, RoutedEventArgs e) { if (t == null) { t = new Thread(this.calculate); t.Start(); btss.Content = “Stop”; } else […]

SynchronizationContext.Post到UI方法

我正在使用Web服务,因此我需要扩展会话长度/重新连接并获取大型数据集等。有时这可能很长,所以我希望它在一个单独的线程中异步更新UI。 我似乎无法理解使用synchronizationContext在我的UI线程上调用方法。 我有它,我已经将我的UIThread上下文传递给我的线程,现在我想在UI线程上更新一些标签等。 我已经阅读了大量的post,但似乎没有解释如何简单地将一些参数传递回方法,或者他们可能会这样做,但我太累了/傻到看到它。 //在主UI线程上 public void updateConnStatus(string conn_name, bool connected) { switch (conn_name) { case “Conn” : if (connected == true){ //do something} break; //在单独的线程上 uiContext.Post( //something to do with delegates in here that eludes me ); 如果有人可以简单地解释我如何将sendOrPostCallBack链接到原始方法,我将非常感激。 谢谢 编辑: 我设法让代码运行并尝试触发事件,它填充我的自定义eventArgs好,但要么说它没有实例化updateUIConnStatus,需要更多的调查:o public void updateUIThread(string conn, bool connected) { uiContext.Post(new SendOrPostCallback((o) => { updateConnStatus(this, new […]

调用线程无法访问此对象,因为不同的线程拥有它。如何编辑图像?

我知道有很多这类问题。 我想发帖,以便我可以分享我的具体问题因为我感到沮丧。 我正在运行一个从db查询路径并将其放入图像元素的线程。问题是,我在xaml中创建了图像,所以当我运行这个线程时,它会抛出无法访问此对象的错误,它无法访问图像元素。 那我怎么设置它而不使用xaml ??这里是我的代码片段: public partial class Window1 : Window { Thread Frame1; public Window1() { InitializeComponent(); intializeDb(); #region start frame 1 thread Frame1 = new Thread(frame1); Frame1.SetApartmentState(ApartmentState.STA); Frame1.IsBackground = true; Frame1.Start(); #endregion } public void frame1() { string k; command.CommandText = “SELECT * FROM imageframe1”; sqlConn.Open(); Reader = command.ExecuteReader(); while (Reader.Read()) { BitmapImage […]

C#中的委托语法问题

我构建了一个Testbox来了解Windows窗体应用程序中的线程。 Silverlight和Java提供了Dispatcher,它在更新GUI元素时非常有用。 代码示例:声明类代表 public delegate void d_SingleString(string newText); 创建线程 _thread_active = true; Thread myThread = new Thread(delegate() { BackGroundThread(); }); myThread.Start(); 线程function private void BackGroundThread() { while (_thread_active) { MyCounter++; UpdateTestBox(MyCounter.ToString()); Thread.Sleep(1000); } } 委派TextBox更新 public void UpdateTestBox(string newText) { if (InvokeRequired) { BeginInvoke(new d_SingleString(UpdateTestBox), new object[] { newText }); return; } tb_output.Text = newText; […]

我应该如何使用multithreading正确调用WebBrowser?

问题范围: 我正在编写一个应用程序来保存从Bing和Google搜索中检索到的HTML。 我知道有一些类可以使用流来执行Web请求,例如这个例子 ,但是由于Google和Bing都使用Javascript和Ajax将结果呈现到HTML中,所以我无法简单地读取流并使用获取结果我需要。 对此的解决方案是使用WebBrowser类并导航到我想要的URL,以便浏览器本身将处理所有Javascript和Ajax脚本执行。 multithreading: 为了提高效率,我使用相同的表单应用程序为每个服务启动一个线程(一个用于Bing,一个用于Google)。 问题: 由于我需要WebBrowser,我已经为每个线程实例化了一个(此时为2)。 根据Microsoft的说法, known bug that prevents the DocumentCompleted event from firing if the WebBrowser is not visible and is not added to a visible form aswell ,则存在一个known bug that prevents the DocumentCompleted event from firing if the WebBrowser is not visible and is not added to a […]