再会。我和UdpClient它一起工作并有包装。
为了阅读,我有异步方法:
\n\nprivate 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}\nRun Code Online (Sandbox Code Playgroud)\n\nWithCancellation我提前终止的扩展方法在哪里:
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}\nRun Code Online (Sandbox Code Playgroud)\n\n手动读取停止后,当我打电话时 …
我在 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
我编写了我的第一个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应用程序),但我不明白为什么它会导致不良行为.
如有必要,我可以粘贴代码.
我在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#WPF UI应用程序,当我关闭它时,我总是得到一个Windows应用程序崩溃对话框("UIDemo遇到了问题,需要关闭.").
错误报告指示它是一个System.ObjectDisposedException,它指示在已处置对象上调用方法的某个位置.那很好,我明白这一部分.
我很想解决它. 我只是无法在这个混蛋上得到一个堆栈跟踪.
该例外正在逃避以下所有情况:
我必须继续的是Windows发送给MS的错误报告的神秘内容.这些十六进制的内存转储并不是那么有用.
有谁知道我怎么能得到那个痕迹?
当应用程序收到来自服务的调用时,它会为每个调用打开一个表单。用户必须在每个窗口中进行输入并关闭它。为了使用户的工作顺利,我试图在显示下一个窗口时重新激活用户正在处理的窗口。
执行此操作的方法如下:
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# ×6
async-await ×1
asynchronous ×1
aws-lambda ×1
dispose ×1
entity ×1
mvvm ×1
stack-trace ×1
udpclient ×1
winforms ×1
wpf ×1