相关疑难解决方法(0)

在控制台应用程序中使用.NET BackgroundWorker类

我对.NET编程和多线程一般都比较陌生,并且想知道是否可以使用.NET提供的BackgroundWorker来产生工作线程来在控制台应用程序中做一些工作?从在线的各种文档中,我看到这个类的意图更多的是面向UI的应用程序,你想在后台做一些工作,但保持UI响应,报告进度,取消处理,如果需要等.

在我的情况下,基本上我有一个控制器类,我想在多个工作线程中产生一些处理(限制使用信号量产生的最大工作线程数).然后我希望我的控制器类阻塞,直到所有线程都完成处理.所以在我启动一个工作线程做一些工作后,我希望线程能够在处理完成时通知控制器线程.我看到我可以使用后台工作者类,并处理事件DoWork和RunWorkerCompleted来实现这一点,但是想知道这是不是一个好主意?有没有更好的方法来实现这一目标?

.net multithreading backgroundworker

12
推荐指数
2
解决办法
2万
查看次数

如何从控制台应用程序处理COM事件?

我正在使用来自第三方库的COM对象来生成定期事件.当我使用Winforms应用程序中的库,将对象作为类成员并在主窗体线程中创建它时,一切正常.但是,如果我从另一个线程创建对象,我不会收到任何事件.

我的猜测是我需要在用于创建对象的同一个线程中有某种事件循环.

我需要从控制台应用程序中使用此对象.我想我可以使用Application.DoEvents,但我宁愿不在控制台App中包含Winforms命名空间.

我怎么解决这个问题?

更新3(2011-06-15):供应商终于回答了.简而言之,他们说Application.Run创建的消息泵与Thread.Join创建的消息泵之间存在一些差异,但他们不知道这有什么区别.

我同意他们; 任何关于此事的光明都会非常感激.

更新:

从理查德评论到mdm回答:

如果其他组件是单线程并从MTA实例化,则Windows将创建工作线程+窗口+消息泵并执行必要的编组.

试着听从他的建议,我正在做以下事情:

更新2:

我改变了JoãoAngelo回答后的代码.

using System;

namespace ConsoleApplication2
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            MyComObjectWrapper wrapper = new MyComObjectWrapper();
        }
    }

    class MyComObjectWrapper
    {
        MyComObject m_Object;
        AutoResetEvent m_Event;

        public MyComObjectWrapper()
        {
            m_Event = new System.Threading.AutoResetEvent(false);

            System.Threading.Thread t = new System.Threading.Thread(() => CreateObject());
            t.SetApartmentState (System.Threading.ApartmentState.STA);
            t.Start();

            Wait();
        }

        void ObjectEvt(/*...*/)
        {
            // ...
        }

        void Wait()
        {
            m_Event.WaitOne();
        }

        void CreateObject()
        {
            m_Object = new MyComObject();
            m_Object.OnEvent …
Run Code Online (Sandbox Code Playgroud)

c# com events interop

12
推荐指数
2
解决办法
4835
查看次数

C#.net使用Console中的HTMLDocument?

我正在尝试System.Windows.Forms.HTMLDocument在控制台应用程序中使用.首先,这甚至可能吗?如果是这样,我如何将网页从网页加载到其中?我试图使用WebBrowser,但它告诉我:

未处理的异常:System.Threading.ThreadStateException:无法实例化ActiveX控件'885 6f961-340a-11d0-a96b-00c04fd705a2',因为当前的读取不在单线程单元中.

关于该HTMLDocument对象似乎缺乏相关教程(或者谷歌只是提出了无用的结果).


刚刚发现mshtml.HTMLDocument.createDocumentFromUrl,但那引起了我的兴趣

未处理的异常:System.Runtime.InteropServices.COMException(0x80010105):服务器抛出异常.(来自HRESULT的异常:0x80010105(RPC_E_SERVERF AULT))at System.RuntimeType.ForwardCallToInvokeMember(String memberName,BindingFla gs flags,Object target,Int32 [] aWrapperTypes,MessageData&msgData)at mshtml.HTMLDocumentClass.createDocumentFromUrl(String bstrUrl,String bstr Options) at iget.Program.Main(String [] args)

有没有搞错?我想要的只是<a>页面上的标签列表.为什么这么难?


对于那些好奇的人,这是我想出的解决方案,感谢TrueWill:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using HtmlAgilityPack;

namespace iget
{
    class Program
    {
        static void Main(string[] args)
        {
            WebClient wc = new WebClient();
            HtmlDocument doc = new HtmlDocument();
            doc.Load(wc.OpenRead("http://google.com"));
            foreach(HtmlNode a in doc.DocumentNode.SelectNodes("//a[@href]"))
            {
                Console.WriteLine(a.Attributes["href"].Value);
            }
        } …
Run Code Online (Sandbox Code Playgroud)

.net c# console

4
推荐指数
1
解决办法
2万
查看次数

处理Windows应用程序中的系统时间更改

我有一个Windows应用程序,当用户更改打开或运行该Windows应用程序的系统的时间时,我想要任何事件.

如何更改时间或特定时间或系统更改时间/日期的任何事件?

c# timer winforms windows-applications

4
推荐指数
1
解决办法
3617
查看次数