相关疑难解决方法(0)

什么是AsyncCallback?

AsyncCallback的用途是什么?我们为什么要使用它?

c# asynchronous

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

Delegate.EndInvoke()真的有必要吗?

我已经阅读了几个论坛,甚至还有一个或两个stackoverflow问题,说使用Delegate.BeginInvoke时需要Delegate.EndInvoke.我读过的很多关于使用BeginInvoke的文章都未提及使用EndInvoke.此外,我仅使用BeginInvoke部署了生产代码,并且似乎没有任何内存问题.我使用BeginInvoke的方式通常是线程,我不关心它们完成或处理多长时间.

.net delegates begininvoke

25
推荐指数
3
解决办法
9440
查看次数

为什么异步委托方法需要调用EndInvoke?

为什么委托需要在方法触发之前调用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)

c# delegates asynchronous

10
推荐指数
2
解决办法
7378
查看次数

C#OpenFileDialog非模态可能

是否可以创建/拥有非模态.net OpenFileDialog我在主对话框中有一个UI元素,总是需要用户按下.

c# modal-dialog openfiledialog

7
推荐指数
2
解决办法
4748
查看次数

从多个线程到一个同步线程的调度工作

假设我有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()的线程不需要回调或类似的东西.

这有什么健康的做法?

.net c# multithreading

6
推荐指数
1
解决办法
149
查看次数

如何正确捕获 WinForms 应用程序中所有未处理的异常

我想为 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)

.net c# exception winforms

5
推荐指数
1
解决办法
7429
查看次数