小编Rya*_*hel的帖子

Delegate.EndInvoke到底做什么?有必要打电话吗?

可能重复:
为什么异步委托方法需要调用EndInvoke?
Delegate.EndInvoke()真的必要吗?

目前正在处理多线程应用程序,并且在引发事件而不是正常工作handler.Invoke();时正在进行实验handler.BeginInvoke();。两者都很好。但是,对于BeginInvoke,我在后两个参数中使用了null,因为不需要回调,并且由于没有回调,因此绝对不需要将数据传递给不存在的回调。

因此,我根本没有调用EndInvoke。但是该应用程序似乎可以完美运行。我读过,人们说可能会发生泄漏,但我只是没有注意到。

不过我很好奇,EndInvoke到底是做什么的?我真的需要进行回调以仅调用EndInvoke就是这样吗?另外,为什么EndInvoke接受IAsyncResult参数?我可以为该权限传递null,因为没有多余的数据传递给回调,对吗?但是,我仍然想知道,为什么还有额外的数据需要传递给EndInvoke?该参数在做什么?我想知道它是如何工作的。

我检查了.NET Reflector,但找不到实际定义EndInvoke的位置。在EventHandler(这是我正在使用的)中,显示的全部是方法标头。

谢谢。

c# delegates invoke

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

如何等待一个任务完成而不阻止调用另一个任务?

试着这样做:

Task task1 = Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, task1Data, 0, task1Data.Length, null, TaskCreationOptions.AttachedToParent);

Task task2 = Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, task2Data, 0, task2Data.Length, null, TaskCreationOptions.AttachedToParent);
Run Code Online (Sandbox Code Playgroud)

但是如果我错了,请纠正我,但在task1执行期间或之前,task2是否有可能执行?我想要一些类似ContinueWith的东西,代码不会阻塞,但task2在task1完成之前仍然不会执行.

我试过这样Task task2 = new Task(...)做我可以打电话,task1.ContinueWith(task2);但它不会编译.我很确定我必须使用FromAsync(自动运行).我认为task1.Wait();在两条线之间放置会有效,但不会阻止吗?试图远离阻止..

有什么建议?

c# asynchronous task

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

如何将两个画布彼此叠放?

我找到了类似的主题,但是它们都使用绝对定位,因此将画布放置在页面的左上方。我将它们包含在div中,但是我不确定如何正确地对其进行分层。我尝试在CSS中使用绝对和相对定位,但没有任何运气。

html5 canvas

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

如何在可执行文件中存储字符串?

我无法使用,Settings因为有一个外部文件.有没有办法在可执行文件中嵌入设置或嵌入数据?

我需要能够启动应用程序,并从内部保存数据,而不是在其他地方加载.

谢谢

c# embedded-resource

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

如何在没有 attachShadow 的情况下创建自定义元素?

假设我有一些这样的代码:

class MyElem extends HTMLElement {
  constructor() {
    super();
    
    let templateContent = document.getElementById('template-elem').content;
    this.innerHTML = templateContent.cloneNode(true);
  }
}

window.customElements.define('my-elem', MyElem);
Run Code Online (Sandbox Code Playgroud)
<template id="template-elem">
  <div class="a">
    <div class="b">b</div>
    <div class="c">c</div>
  </div>
</template>

<my-elem></my-elem>
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?在 Chrome 检查器中,自定义元素内部没有 HTML。我也试过这样做:

this.append(templateContent.cloneNode(true)); 
Run Code Online (Sandbox Code Playgroud)

但这也导致了一个空的 HTML 树。

所有教程都提到使用 shadow DOM,如下所示:

this.attachShadow({mode: 'open'}).appendChild(templateContent.cloneNode(true));
Run Code Online (Sandbox Code Playgroud)

虽然这样做有效,但它会强制您将 Shadow DOM 用于您的自定义元素。有没有办法在不需要使用 Shadow DOM 的情况下将模板的 HTML 附加到您的自定义元素?我更喜欢在我的小用例中使用全局 CSS 样式。

html javascript web-component shadow-dom

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

在什么条件下NetworkStream不会一次读入所有数据?

在回调中,NetworkStream.BeginRead我似乎注意到始终读取所有字节。我看到许多教程检查BytesRead是否小于总字节,如果是,请再次读取,但是似乎从来没有。

if (bytesRead < totalBytes)即使一次发送大量数据(数千个字符),并且即使缓冲区大小设置为非常小的值(大约16个),该条件也永远不会触发。

我没有使用“老式方式”进行测试,因为我正在使用Task.Factory.FromAsync而不是调用NetworkStream.BeginRead并提供一个我称为EndRead的回调。也许Tasks自动包含了直到读取完所有数据才返回的功能?我不确定。

无论哪种方式,我仍然对何时不能一次读取所有数据感到好奇。甚至需要检查是否未读取所有数据,如果需要,则再次读取?我似乎无法获得有条件运行的条件。

谢谢。

c# android networkstream stream android-asynctask

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

重构这个/减少LOC的好方法?

我有这个代码:

switch (currentLetter)
{
    case 'A': return 'B';
    case 'B': return 'C';
    case 'C': return 'D';
    case 'D': return 'E';
    case 'E': return 'F';
    case 'F': return 'G';
    case 'G': return 'H';

    case 'a': return 'b';
    case 'b': return 'c';
    case 'c': return 'd';
    case 'd': return 'e';
    case 'e': return 'f';
    case 'f': return 'g';
    case 'g': return 'h';
}
Run Code Online (Sandbox Code Playgroud)

我想到了许多方法来改变它,但我不确定选择哪个.我可以替换所有返回(char)(currentLetter + 1),使用带有ASCII值的if语句来确定范围,然后执行(char)(currentLetter + 1),使用Enumerable.Range.Contains然后查看该值是否在范围内,用if替换开关等.

这段代码不会在其他任何地方重复,我不确定这是不是最好的方法,因为代码的读者对于正在发生的事情非常清楚,他们不必考虑字符代码,算术等.此外,永远不会有任何更多的字符添加到case语句,所以它不会变得笨拙.

不确定我是应该保留原样还是更改它.

c# refactoring character switch-statement

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

这些空数组String.Split方法调用有什么区别?

这两行代码之间有什么区别吗?

1) someString.Split(new[] { ';' });

2) someString.Split(';');

我看到我正在编写的代码中的第一个,并且想知道我是否可以安全地将其更改为第二个或者为什么他们选择以第一种方式执行此操作.

谢谢.

c# string refactoring split

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

如何在堆栈上分配数组以提高性能?

一些最优化的函数版本,例如popcountcount consecutive zeros使用表查找来获得最终答案。

在 C 和 C++ 中,可以在堆栈上分配数组并快速访问它们。

有没有办法在 C# 中做到这一点?据我所知,stackalloc只能在函数内使用,因此数组不会持久化。

我有一个小的查找表,我希望能够尽快访问它,因此更愿意在堆栈而不是堆上分配它。

c# arrays performance heap-memory stack-memory

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