我已经阅读了几个论坛,甚至还有一个或两个stackoverflow问题,说使用Delegate.BeginInvoke时需要Delegate.EndInvoke.我读过的很多关于使用BeginInvoke的文章都未提及使用EndInvoke.此外,我仅使用BeginInvoke部署了生产代码,并且似乎没有任何内存问题.我使用BeginInvoke的方式通常是线程,我不关心它们完成或处理多长时间.
为什么委托需要在方法触发之前调用EndInvoke?如果我需要调用EndInvoke(它阻塞线程)那么它真的不是异步调用吗?
这是我试图运行的代码.
class Program
{
private delegate void GenerateXmlDelegate();
static void Main(string[] args)
{
GenerateXmlDelegate worker = new GenerateXmlDelegate(GenerateMainXml);
IAsyncResult result = worker.BeginInvoke(null, null);
}
private static void GenerateMainXml()
{
Thread.Sleep(10000);
Console.WriteLine("GenerateMainXml Called by delegate");
}
}
Run Code Online (Sandbox Code Playgroud) 是否可以创建/拥有非模态.net OpenFileDialog我在主对话框中有一个UI元素,总是需要用户按下.
假设我有10个线程忙着做某事他们有时会调用一个方法
public HandleWidgets(Widget w) { HeavyLifting(w) }
Run Code Online (Sandbox Code Playgroud)
但是,我不希望我的10个线程在HeavyLifting(w)上等待,而是将HeavyLifting(w)工作分配给第11个线程,即HeavyLifter线程并以异步方式继续.调度的HeavyLifter线程应该始终是同一个线程,我不想创建多个线程(因此,我不能做这样的事情:没有EndInvoke的C#异步调用?).
HeavyLifting(w)是"发射并忘记",因为调用HandleWidgets()的线程不需要回调或类似的东西.
这有什么健康的做法?
我想为 WinForms 应用程序中任何线程的所有未处理异常设置处理程序方法。我自己不创建任何应用程序域。
根据UnhandledException文档,我也需要UnhandledExceptionMode.ThrowException通过方法设置模式Application.SetUnhandledExceptionMode来捕获主线程的异常:
在使用 Windows 窗体的应用程序中,主应用程序线程中未处理的异常会导致引发 Application.ThreadException 事件。如果处理此事件,则默认行为是未处理的异常不会终止应用程序,尽管应用程序仍处于未知状态。在这种情况下,不会引发 UnhandledException 事件。可以通过使用应用程序配置文件或在挂接 ThreadException 事件处理程序之前使用 Application.SetUnhandledExceptionMode 方法将模式更改为 UnhandledExceptionMode.ThrowException 来更改此行为。这仅适用于主应用程序线程。UnhandledException 事件是针对其他线程中抛出的未处理异常而引发的
因此,生成的代码将如下所示:
public static void UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e)
{
// ...
}
[STAThread]
static void Main(string[] args)
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionEventHandler);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm(pathToCheck));
}
Run Code Online (Sandbox Code Playgroud)
可以吗?它会捕获来自任何线程(包括主线程、UI 线程和Task类创建的所有线程)的所有未处理的异常吗?我正确理解了文档吗?
是的,我在这里看到了这样的问题,但我不明白为什么我还应该使用以下代码:
Application.ThreadException += new
ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×3
asynchronous ×2
delegates ×2
begininvoke ×1
exception ×1
modal-dialog ×1
winforms ×1