我对.NET编程和多线程一般都比较陌生,并且想知道是否可以使用.NET提供的BackgroundWorker来产生工作线程来在控制台应用程序中做一些工作?从在线的各种文档中,我看到这个类的意图更多的是面向UI的应用程序,你想在后台做一些工作,但保持UI响应,报告进度,取消处理,如果需要等.
在我的情况下,基本上我有一个控制器类,我想在多个工作线程中产生一些处理(限制使用信号量产生的最大工作线程数).然后我希望我的控制器类阻塞,直到所有线程都完成处理.所以在我启动一个工作线程做一些工作后,我希望线程能够在处理完成时通知控制器线程.我看到我可以使用后台工作者类,并处理事件DoWork和RunWorkerCompleted来实现这一点,但是想知道这是不是一个好主意?有没有更好的方法来实现这一目标?
我正在使用来自第三方库的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) 我正在尝试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) 我有一个Windows应用程序,当用户更改打开或运行该Windows应用程序的系统的时间时,我想要任何事件.
如何更改时间或特定时间或系统更改时间/日期的任何事件?