我正在设计一个执行长时间运行任务的类.我想出的第一个设计是:
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需要单独订阅已完成的事件.
如果有的话,使用我缺少的标准模式有什么好处?
默认情况下,引用类型数组初始化,所有引用都为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) 我有一个长期运行的任务,它使用回调来递增地提供数据(而不是最后一个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'
我通过常见的异步回调从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#测试一些案例以考虑性能方面的一些基本要素,而我在测试时遇到了一个奇怪的情况
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倍?
首先,我感谢UDP不是一个可靠的协议,我不能保证通过网络接收数据包.
但是,如果数据包确实到达我的机器,我保证在应用程序级别接收它,或者网络堆栈是否可以将其丢弃而不受惩罚?
我问的原因是我偶尔会丢失数据包,即使我知道它们在线上(简单的EtherCAT总线,所以数据包总是循环回来).
可能重复:
如何快速找到接口方法的实现?
转到具体类型的定义
在您希望快速跳转到函数实现之前,编码到接口很有用.
在好日子里,F12(转到定义)会直接带你到那里,但是现在它只是带你到接口定义,而不是实现.
我感谢可能有多个实现,但有一种比手动查找文件更快的方法,或者Ctrl-Shift-F搜索所有引用,即使它也包括每个调用."查找所有引用"给出了相同的结果.
只是想知道是否有人有一个方便的方法/宏?
这可能是非常主观的,但是当控制变量在循环中更新时,人们通常如何在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#的表达似乎没有这样的方式:(
回到我的COM时代,通常使用界面名称中的I作为人称代词,就像对象描述它可以做什么一样.即:
IProvideData
Run Code Online (Sandbox Code Playgroud)
在.Net的世界中仍然如此,或者它现在优先使用第三人:
IDataProvider
Run Code Online (Sandbox Code Playgroud) 对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) c# ×9
asynchronous ×2
arrays ×1
callback ×1
dialog ×1
dispose ×1
ethercat ×1
expression ×1
intellisense ×1
interface ×1
jquery ×1
openlayers ×1
performance ×1
popup ×1
reference ×1
reliability ×1
task ×1
time ×1
udp ×1
udpclient ×1
while-loop ×1
windows ×1
z-order ×1