已回答 Backgroundworker中的例外

状态
不接受进一步的答复。

马克维特

成员
已加入
2021年2月5日
留言内容
6
编程经验
5-10
我正在使用.NET 4.5。我的程序启动了后台工作者任务。我注意到在此后台工作程序任务中未引发异常。如果运行Debug,则将看到异常。我依靠Socket操作的异常捕获。为什么不抛出这些异常?

谢谢你,
标记
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
They are being thrown, and they're being caught. You use the RunWorkerCompleted event to determine whether an exception was thrown in the 做工作 event handler and, if so, what it was.
 

马克维特

成员
已加入
2021年2月5日
留言内容
6
编程经验
5-10
RunWorkerCompleted是否用于从主线程捕获它?无论如何,后台工作人员中是否有捕获异常的地方?后台工作程序处于活动状态,直到关闭主窗体。
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
您将以与其他任何异常相同的方式捕获它,即使用Try ... Catch块。 BackgroundWorker本身会捕获任何引发但未捕获在DoWork事件处理程序中的异常,并将其打包在RunWorkerCompleted事件处理程序中。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
约翰,我可以借你的水晶球吗?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
欢迎来到btw论坛。

如果您不使用 TryCatchBlocks,则会引发错误,并且 做工作 事件将触发 RunWorkerCompleted event, and it does this because the 做工作 event can't continue execution of that code.

You need to check the status of the RunWorkerCompleted event. To find the result, look in the RunWorkerCompletedEventArgs.Result属性 看看您的事件如何执行。

If the 做工作 event experienced an error, then this error will be passed on to the RunWorkerCompleted Event where you can and should check it first by accessing the e.Error property of this event. By checking the AsyncCompletedEventArgs.Error属性 on any Async run code, you can determine if there was in fact an error, and determine what that error was. If you wrap your error code in TryCatchBlocks, then the e.Error property will not show any error raised because it was handled or expects it was handled in the TryCatchBlock.

如果您不使用 TryCatchBlocks in the 做工作 Event. Any attempts to access any other properties of the RunWorkerCompleted events properties will likely return null if an error was passed from your DoWork event, as the only property you will be able to check at such a point is the e.Error property, as to ascertain what the problem was that caused the error in your 做工作 Event.

Given you see errors only in debug mode but you are not seen any errors on your executed code without the debugger attached; is normal. This is also indicative that you are running your code without TryCatchBlocks and your error is running silent through the RunWorkerCompleted event.

我也将其标记为“已回答”,因为它直接回答了您的问题。从今天开始,我将不会回答任何问题。如果有的话,我确定他们可以帮助您。
 
解决方案

马克维特

成员
已加入
2021年2月5日
留言内容
6
编程经验
5-10
您将以与其他任何异常相同的方式捕获它,即使用Try ... Catch块。 BackgroundWorker本身会捕获任何引发但未捕获在DoWork事件处理程序中的异常,并将其打包在RunWorkerCompleted事件处理程序中。

如果分配的端口已在使用中,我试图捕获异常。使用该端口时,不会引发任何异常。我阅读评论的方式是,只要有一个TryCatchBlock,我就应该在DoWork中捕获它?
C#:
       public void ServerSocketInit()
        {
            try
            {
                connecting = true;

                // Create the listening socket.
                socketlistener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // Establish the local endpoint for the socket.
                IPAddress ipAddress = IPAddress.Parse(_hostIP);
                IPEndPoint localEndPoint = new IPEndPoint(ipAddress, _hostPort);

                // Bind the socket to the local endpoint and listen for incoming connections.
                socketlistener.Bind(localEndPoint);

                // Start Listening
                socketlistener.Listen(1);
                ServerSocketListen();
            }
            catch (SocketException)
            {
                initfailed = false;
            }
        }
 
由主持人最后编辑:

马克维特

成员
已加入
2021年2月5日
留言内容
6
编程经验
5-10
欢迎来到btw论坛。

如果您不使用 TryCatchBlocks,则会引发错误,并且 做工作 事件将触发 RunWorkerCompleted event, and it does this because the 做工作 event can't continue execution of that code.

You need to check the status of the RunWorkerCompleted event. To find the result, look in the RunWorkerCompletedEventArgs.Result属性 看看您的事件如何执行。

If the 做工作 event experienced an error, then this error will be passed on to the RunWorkerCompleted Event where you can and should check it first by accessing the e.Error property of this event. By checking the AsyncCompletedEventArgs.Error属性 on any Async run code, you can determine if there was in fact an error, and determine what that error was. If you wrap your error code in TryCatchBlocks, then the e.Error property will not show any error raised because it was handled or expects it was handled in the TryCatchBlock.

如果您不使用 TryCatchBlocks in the 做工作 Event. Any attempts to access any other properties of the RunWorkerCompleted events properties will likely return null if an error was passed from your DoWork event, as the only property you will be able to check at such a point is the e.Error property, as to ascertain what the problem was that caused the error in your 做工作 Event.

Given you see errors only in debug mode but you are not seen any errors on your executed code without the debugger attached; is normal. This is also indicative that you are running your code without TryCatchBlocks and your error is running silent through the RunWorkerCompleted event.

我也将其标记为“已回答”,因为它直接回答了您的问题。从今天开始,我将不会回答任何问题。如果有的话,我确定他们可以帮助您。

我正在使用尝试捕获块,但由于某种原因未引发异常。它以调试模式抛出。我发布了一些代码。我一定想念一些东西,或者只是感到困惑。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,604
地点
弗吉尼亚州切萨皮克
编程经验
10+
I would assume that if the exception is thrown, you would set initfailed to true, but in the code you presented above, you are setting it to false.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
I would assume that if the exception is thrown, you would set initfailed to true, but in the code you presented above, you are setting it to false.
也许你错过了。但这不是背景工作者。

如果您查看该线程的标题。我在这里的回应 已回答-backgroundworker中的异常 -解释了如何处理该错误以及是否使用TryCatchBlocks。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
如果OP使用后台工作程序,则不应使用TryCatchBlock。

由于他们发布的代码与后台工作无关,因此他们应该使用finally语句在TryCatchBlock中处理错误。

我即将关闭此主题,因为它根本不反映主题标题,并且所提议的代码与后台工作程序没有任何关系。这将对未来的读者产生误导。

@markwitt 后台工作者在哪里?
 

马克维特

成员
已加入
2021年2月5日
留言内容
6
编程经验
5-10
I would assume that if the exception is thrown, you would set initfailed to true, but in the code you presented above, you are setting it to false.
啊,Geesh。。。我简直不敢这么简单。我觉得自己是个白痴。我完全忽略了显而易见的事实。感谢所有人的帮助,并指出我在网站上的愚蠢行为。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
In future, when you come to a forum for assistance whilst asking about one thing. Do not propose code that does not reflect what you are working with or asking about. This below snip uses 做工作EventArgs, and also proves you are using a background worker.
C#:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
对于后台工作程序,它没有任何此类事件参数。它也不属于背景工作者。它只是一种方法:
C#:
public void ServerSocketInit()
如果您正确使用了后台工作程序,则由于已经向您解释的原因,您不会在DoWork事件中捕获该错误。我建议您开始阅读我提供给您的有关该组件的链接。

下次完全按照编写代码的方式发布您的代码。
 
状态
不接受进一步的答复。
最佳 底部