标签: objectdisposedexception

UdpClient.ReceiveAsync 正确提前终止

再会。我和UdpClient它一起工作并有包装。

\n\n

为了阅读,我有异步方法:

\n\n
private async Task<byte[]> Receive(UdpClient client, CancellationToken breakToken)\n{\n    // \xd0\x92\xd1\x8b\xd1\x85\xd0\xbe\xd0\xb4 \xd0\xb8\xd0\xb7 async, \xd0\xb5\xd1\x81\xd0\xbb\xd0\xb8 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb8\xd0\xb7\xd0\xbe\xd1\x88\xd1\x91\xd0\xbb CancellationRequest\n    breakToken.ThrowIfCancellationRequested();\n\n    UdpReceiveResult result;\n    try\n    {\n        result = await client.ReceiveAsync().WithCancellation(breakToken);\n    }\n    catch(OperationCanceledException)\n    {\n        // \xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd0\xbd\xd0\xb0\xd1\x8f \xd1\x81\xd0\xb8\xd1\x82\xd1\x83\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f \xd1\x80\xd1\x83\xd1\x87\xd0\xbd\xd0\xbe\xd0\xb9 \xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb8 Task-\xd0\xb0\n    }\n\n    return result.Buffer;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

WithCancellation我提前终止的扩展方法在哪里:

\n\n
public static async Task<T> WithCancellation<T>(\n    this Task<T> task, CancellationToken cancellationToken)\n{\n    var tcs = new TaskCompletionSource<bool>();\n\n    using (cancellationToken.Register(\n        s => ((TaskCompletionSource<bool>)s).TrySetResult(true),\n        tcs))\n        if (task != await Task.WhenAny(task, tcs.Task))\n            throw new OperationCanceledException(cancellationToken);\n\n    return await task;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

手动读取停止后,当我打电话时 …

c# asynchronous udpclient objectdisposedexception

3
推荐指数
1
解决办法
8373
查看次数

Lambda 遇到 UnobservedTaskException - 无法访问已处置的对象

我在 AWS Lambda 的 CloudWatch 日志中注意到了此异常。

一切似乎都已得到处理,因此我认为这是在 Lambda 完成执行后创建的 AWS 代码(而不是我编写的代码)中的异常。

由于它在功能上有效,所以我一直忽略它,但我担心可能存在我没有注意到的问题。


Lambda 通过“TaskScheduler.UnobservedTaskException”事件遇到 UnobservedTaskException:

{
    "errorType": "AggregateException",
    "errorMessage": "A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (Cannot access a disposed object.\nObject name: 'System.Net.Sockets.UdpClient'.)",
    "cause": {
        "errorType": "ObjectDisposedException",
        "errorMessage": "Cannot access a disposed object.\nObject name: 'System.Net.Sockets.UdpClient'.",
        "stackTrace": [
            "at System.Net.Sockets.UdpClient.EndReceive(IAsyncResult asyncResult, IPEndPoint& remoteEP)",
            "at System.Net.Sockets.UdpClient.<>c.<ReceiveAsync>b__56_1(IAsyncResult asyncResult)",
            "at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, …
Run Code Online (Sandbox Code Playgroud)

c# objectdisposedexception async-await amazon-cloudwatch aws-lambda

3
推荐指数
1
解决办法
1864
查看次数

如何在C#/ MVVM应用程序中解决莫名其妙的ObjectDisposedExceptions?

我编写了我的第一个MVVM应用程序.当我关闭应用程序时,我常常因ObjectDisposedException而导致崩溃.应用程序窗口消失后,应用程序即将崩溃.

获取堆栈跟踪很困难(参见我的另一个问题),但最后我做了,发现我的堆栈跟踪完全包含在C#库中(kernel32!BaseThreadStart,mscorwks!Thread,mscorwks!WKS等).

此外,这种崩溃是不一致的.在我上次结账和重建之后,它停止了一段时间.然后它又回来了.一旦它开始发生,它就会不断发生,即使我"清理"并重建.但擦拭和结账有时会使它停止一段时间.

我认为发生了什么:

我认为GarbageCollector在处理我的ViewModel时做的很有趣.我的ViewModelBase类析构函数在调用析构函数时有一个WriteLine来记录,而我的4个ViewModel中只有2或3个被处理掉了,它似乎根据结账而变化(例如,当我在我的运行时,我看到一直在重复顺序,但我的同事看到不同的序列与不同的对象处置).

由于堆栈跟踪没有我的代码调用,我认为这意味着我的代码不是调用被处置对象的方法.所以这让我觉得CLR是愚蠢的.

这有意义吗?有什么方法可以让GC保持一致吗?这是红鲱鱼吗?

其他可能
有用的细节:我的所有Views和ViewModel都是在App.xaml.cs文件的Application的Startup事件处理程序中创建的.同一个处理程序将ViewModels分配给DataContexts.我不确定这是否是正确的MVVM实践(正如我所说的,我的第一个MVVM应用程序),但我不明白为什么它会导致不良行为.

如有必要,我可以粘贴代码.

c# garbage-collection mvvm objectdisposedexception

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

对象实例已被处置(EF)

我在EntityFramework中检索我的Project实体时遇到了一些问题.它不断给我Objest实例已被处置错误.

我有2个实例,如下图所示.在此输入图像描述

以下代码给出了错误:

    public Project GetProjectyById(int id)
    {
        using (var context = new CoderaDBEntities())
        {
            return context.Projects.First(c => c.Id == id);
        }
    }
Run Code Online (Sandbox Code Playgroud)

从Project检索的所有东西都很好,但是Project对象里面的Category对象(关联)传递给我的对象已被处理错误.这是怎么回事?

谢谢!

编辑:这种关联看起来很奇怪吗?

c# entity dispose entity-framework objectdisposedexception

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

C#/ WPF app抛出一个ObjectDisposedException; 为什么我无法捕获或获得堆栈跟踪?

我有一个C#WPF UI应用程序,当我关闭它时,我总是得到一个Windows应用程序崩溃对话框("UIDemo遇到了问题,需要关闭.").

错误报告指示它是一个System.ObjectDisposedException,它指示在已处置对象上调用方法的某个位置.那很好,我明白这一部分.

我很想解决它. 我只是无法在这个混蛋上得到一个堆栈跟踪.

该例外正在逃避以下所有情况:

  • 我的DispatcherUnhandledException处理程序
  • 我的try/catch包含Exit事件处理程序的全部内容
  • 单击该应用程序崩溃对话框中的"调试"将关闭它并且不执行任何操作
  • 在VisualStudio的调试模式下运行应用程序似乎可以工作,但奇怪的是,它似乎没有这种方式崩溃,所以没有跟踪

我必须继续的是Windows发送给MS的错误报告的神秘内容.这些十六进制的内存转储并不是那么有用.

有谁知道我怎么能得到那个痕迹?

c# wpf stack-trace objectdisposedexception

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

检查 IsDispose 和 Disusing 时“无法访问已处置的对象”

当应用程序收到来自服务的调用时,它会为每个调用打开一个表单。用户必须在每个窗口中进行输入并关闭它。为了使用户的工作顺利,我试图在显示下一个窗口时重新激活用户正在处理的窗口。

执行此操作的方法如下:

private void ActivatePreviousActiveForm() {

    if (_activeWhenOpen != null && _activeWhenOpen.InvokeRequired) {
         if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)
              _activeWhenOpen.Invoke((MethodInvoker)ActivatePreviousActiveForm);
    } else
         if (_activeWhenOpen != null && !(_activeWhenOpen is FrmRuntimeError))
             _activeWhenOpen.Activate();
}
Run Code Online (Sandbox Code Playgroud)

有时,当到达该行时,它会抛出“无法访问已处置的对象”

if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会发生这种情况?

c# objectdisposedexception winforms

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