小编Gaz*_*yer的帖子

使用标准.Net异步模式的优点?

我正在设计一个执行长时间运行任务的类.我想出的第一个设计是:

public TaskHandle DoSomethingAsync(DoSomethingCompleteCallback completedCallback);
public void       CancelDoSomething(TaskHandle handle);
Run Code Online (Sandbox Code Playgroud)

这简单而简洁.但是,我想知道我是否应该将其作为我一直在阅读的标准.Net异步模式之一来实现?

APM:

public IAsyncResult BeginDoSomething(AsyncCallback completedCallback, Object stateObject);
public void         EndDoSomething(IAsyncResult asyncResult);
Run Code Online (Sandbox Code Playgroud)

EAP:

public void  DoSomethingAsync(string param, object userState);
public event DoSomethingCompletedEventHandler DoSomethingCompleted;
Run Code Online (Sandbox Code Playgroud)

IMO这些似乎使界面变得复杂,除了作为其他.Net开发人员可识别的模式之外没有任何实际优势.APM要求客户端代码始终在其completedCallback中调用EndDoSomething(),并且EAP需要单独订阅已完成的事件.

如果有的话,使用我缺少的标准模式有什么好处?

c# design-patterns asynchronous

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

初始化引用类型数组的简便方法?

默认情况下,引用类型数组初始化,所有引用都为null.

是否有任何语法技巧来使用新的默认对象初始化它们?

例如

public class Child
{
}

public class Parent
{
    private Child[] _children = new Child[10];

    public Parent()
    {
        //any way to negate the need for this?
        for (int n = 0; n < _children.Length; n++)
           _children[n] = new Child();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# arrays reference array-initialization

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

将Task实例传递给任务的委托

我有一个长期运行的任务,它使用回调来递增地提供数据(而不是最后一个ContinueWith()回调).

我希望能够在此回调中传递Task对象以进行任务识别(使用Task.CurrentId)

但是,我无法弄清楚如何将Task对象传递给任务委托.似乎没有超载来执行此操作,并且我无法使用闭包来执行此操作,因为此时未定义任务对象.

例如.

public Task StartDoingSomeStuff(CallbackDelegate callback)
{
    Task task = Task.Factory.StartNew(() =>
    {
         while(whatever)
         {
             var results = DoSomeStuff();
             callback(results, task); //CS0165. How do I get hold of the task?
         }
    });

    return task;
}
Run Code Online (Sandbox Code Playgroud)

得到:

错误CS0165:使用未分配的局部变量'task'

c# callback task task-parallel-library

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

我如何知道UdpClient是否已被关闭/处置?

我通过常见的异步回调从UdpClient接收数据:

private void OnUdpData(IAsyncResult result)
{
    byte[] data = _udpReceive.EndReceive(result, ref _receiveEndPoint);

    //Snip doing stuff with data

    _udpReceive.BeginReceive(OnUdpData, null);
}
Run Code Online (Sandbox Code Playgroud)

当我Close()在主线程中的UdpClient时,回调会像我期望的那样触发,但是此时_udpReceive已经处理掉了,ObjectDisposedException当我尝试呼叫时我得到了一个EndReceive().我本来希望得到一个空的缓冲区.

处理这个问题的正确方法是什么?UdpClient在尝试使用它之前是否有一些我可以检查的成员,或者它是唯一的方法将它包装在一起try{}并捕获ObjectDisposedException?对于正常的关闭来说,这看起来非常糟糕.

c# dispose asynchronous udpclient

4
推荐指数
2
解决办法
7547
查看次数

C#表现奇怪的情况

我正在用C#测试一些案例以考虑性能方面的一些基本要素,而我在测试时遇到了一个奇怪的情况

 for (int i = 0; i < 30; i++)
 {
     DateTime d = DateTime.Now;
     print();
     result.Add  ((DateTime.Now - d));
 }

 foreach(TimeSpan t in result)
     Console.WriteLine(t.ToString());
Run Code Online (Sandbox Code Playgroud)

虽然打印功能很简单:

public static void print ()
{
     for (int i = 0; i < 10000; i++)
     {
         Console.WriteLine( string.Format("{0}", i));       
     }
}
Run Code Online (Sandbox Code Playgroud)

我对结果感到震惊,而前三个循环花了大约5秒钟,而之后花了大约0.5秒.这是一些:

00:00:05.6212696
00:00:05.6072002
00:00:05.5837965
00:00:01.9451673
00:00:00.5526335
00:00:00.5540554
00:00:00.5676418
00:00:00.5372442
00:00:00.5772550
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么在第三次迭代后它变好了近10倍?

c# performance time

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

如果UDP数据包在线上,我保证在应用层得到它们吗?

首先,我感谢UDP不是一个可靠的协议,我不能保证通过网络接收数据包.

但是,如果数据包确实到达我的机器,我保证在应用程序级别接收它,或者网络堆栈是否可以将其丢弃而不受惩罚?

我问的原因是我偶尔会丢失数据包,即使我知道它们在线上(简单的EtherCAT总线,所以数据包总是循环回来).

c# windows udp reliability ethercat

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

接口实现的"Go To Definition"等效快捷方式?

可能重复:
如何快速找到接口方法的实现?
转到具体类型的定义

在您希望快速跳转到函数实现之前,编码到接口很有用.

在好日子里,F12(转到定义)会直接带你到那里,但是现在它只是带你到接口定义,而不是实现.

我感谢可能有多个实现,但有一种比手动查找文件更快的方法,或者Ctrl-Shift-F搜索所有引用,即使它也包括每个调用."查找所有引用"给出了相同的结果.

只是想知道是否有人有一个方便的方法/宏?

c# intellisense visual-studio interface-implementation

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

c#表达和循环美

这可能是非常主观的,但是当控制变量在循环中更新时,人们通常如何在C#中布置它们的循环控制?我内心的学究者不喜欢单独的声明和重复.例如.

string line = reader.ReadLine();
while (line != null)
{
    //do something with line

    line = reader.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

我的C编码器想要改变它

while (string line = reader.ReadLine() != null)
{
    //do something with line
}
Run Code Online (Sandbox Code Playgroud)

但是C#的表达似乎没有这样的方式:(

c# expression while-loop

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

在界面名称中使用I作为人称代词

回到我的COM时代,通常使用界面名称中的I作为人称代词,就像对象描述它可以做什么一样.即:

IProvideData
Run Code Online (Sandbox Code Playgroud)

在.Net的世界中仍然如此,或者它现在优先使用第三人:

IDataProvider
Run Code Online (Sandbox Code Playgroud)

c# interface naming-conventions

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

JQuery弹出窗口出现在一些地图元素下

对JQuery和OpenLayers都很陌生.在我尝试使用JQuery的对话框类打开模态对话框之前,一切都在顺利进行.

该对话框工作正常,但它出现在地图的某些元素下:

在此输入图像描述

Opera和Chrome都是一样的(未经过其他测试).任何人都可以建议一种解决方法吗?谢谢.

编辑:我在这里创建了一个演示问题的小提琴.

HTML:

<body>
    <div id="map"></div>

    <div id="popup" title="Test">
        <p>Blah blah</p>
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

使用Javascript:

var map;

$(function () {

    //init map
    map = new OpenLayers.Map('map', {});
    var wms = new OpenLayers.Layer.Google('Google Map Layer', { type: google.maps.MapTypeId.HYBRID });

    map.addLayer(wms);

    if (!map.getCenter()) {
        map.zoomToMaxExtent();
    }

    //init popup
    $("#popup").dialog({
        height: 400,
        width: 300,
        modal: true
    });
});?
Run Code Online (Sandbox Code Playgroud)

jquery dialog popup z-order openlayers

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