例如,每当我等待编译器通知我的内容时,包含的方法必须是Async.为什么这种方式看不到异步lamba?如果ForEach隐藏它,那么是否有一些关于不返回Task对象和ForEach隐式异步void的危险?
public void SaveSome()
{
Array.ForEach(Enumerable.Range(0,3).ToArray(), async x => await SaveRep());
}
Run Code Online (Sandbox Code Playgroud) 我在测试应用程序中应用了这些处理程序:
Application.ThreadException += Application_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
Run Code Online (Sandbox Code Playgroud)
然后我在窗体上的嵌套Task/Async await上创建一个异常:
尽管处理程序被解雇 - CurrentDomain.UnhandledException应用程序仍然崩溃.
为什么会崩溃而不显示对话框并保持运行?
System.Exception未处理消息:mscorlib.dll中出现未处理的"System.Exception"类型的异常附加信息:dd
private async void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("Main " + Thread.CurrentThread.ManagedThreadId);
try
{
await Hello();
}
catch (Exception ex)
{
Console.WriteLine("Exception on main " + Thread.CurrentThread.ManagedThreadId);
}
}
private async static Task Hello() //changed from void
{
await Task.Run(() => new IGetRun().Run1());
}
internal class IGetRun
{
public async Task Run1() //changed from void
{
Console.WriteLine("Run1 …Run Code Online (Sandbox Code Playgroud) 如果我将一个类声明为内部类,为什么IL将其显示为私有?
internal class Thing
.class private auto ansi beforefieldinit Thing.Thing
extends [mscorlib]System.Object
Run Code Online (Sandbox Code Playgroud) 我可以打字
Square[,,,] squares = new Square[3, 2, 5, 5];
squares[0, 0, 0, 1] = new Square();
Run Code Online (Sandbox Code Playgroud)
事实上,我希望我可以继续向Int.MaxValue添加维度,虽然我不知道需要多少内存.
我怎么能在我自己的类中实现这个变量索引功能?我想封装一个未知维度的多维数组,并使其可用作属性,从而以这种方式实现索引.我必须始终知道大小在哪种情况下Array如何工作?
编辑
感谢您的评论,这是我最终得到的结果 - 我确实想到了params,但在不了解GetValue之后不知道该去哪里.
class ArrayExt<T>
{
public Array Array { get; set; }
public T this[params int[] indices]
{
get { return (T)Array.GetValue(indices); }
set { Array.SetValue(value, indices);}
}
}
ArrayExt<Square> ext = new ArrayExt<Square>();
ext.Array = new Square[4, 5, 5, 5];
ext[3, 3, 3, 3] = new Square();
Run Code Online (Sandbox Code Playgroud)
TBH我现在不需要这个.我只是在寻找一种方法来扩展Array来初始化它已经解决的元素,以便在我使用多数组时(主要在单元测试中)避免类外的循环初始化代码.然后我点击intellisense并看到了Initialize方法......虽然它将我限制为默认构造函数和值类型.对于参考类型,将需要扩展方法.我仍然学到了一些东西,是的,当我尝试一个超过32维的数组时,出现了运行时错误.
public class TestClass
{
public int Num { get; set; }
public string Name { get; set; }
}
IEnumerable<TestClass> originalEnumerable
= Enumerable.Range(1, 1).
Select(x => new TestClass() { Num = x, Name = x.ToString() });
List<TestClass> listFromEnumerable = originalEnumerable.ToList();
// false
bool test = ReferenceEquals(listFromEnumerable[0], originalEnumerable.ElementAt(0));
Run Code Online (Sandbox Code Playgroud)
如果我修改复制的对象,原始文件不会更改.
我从中理解,System.Linq.IEnumerable<T>即使在调用ToList()/ 时它们是引用类型,集合也总是会生成新对象ToArray().我错过了一些东西,因为其他SO问题坚持只有复制参考.
最近我实现了一个Trie数据结构,并确定节点可以存储不同类型的数据或者实现变化,所以我去了Node<T>.然后当我进入构建Trie的算法时,我意识到它需要更多关于Node的知识,所以我限制泛型类使用INode接口.这允许更大的灵活性,但在泛型类的上下文中感觉错误.
通用类对实现接口的类具有不同的用例.例如,List<T>- 算法可以在不依赖于一组相关抽象的情况下工作.实现接口的类可能需要多态/ DI,但接口将更加专业化.
在什么情况下其他人应用泛型类T,其中T可以实现更专业的接口?
我认为当T不需要公开操作/数据时会使用泛型类,虽然我可以看到在T实现IDisposable或其他更通用的接口时可以使用泛型类.
澄清这些要点有什么帮助吗?
每次下面都运行Mike的异常被捕获.
是否所有顺序涉及每个任务之间的延续上下文或所有任务是否同时运行?如果它同时发生,为什么迈克的例外总是被抓住而不是米奇的.我拖延迈克,以便给米奇一个机会.如果它是顺序的,那使它并发?在进行Web请求/执行文件处理时是否会应用并发执行?
假设这个代码更严重,那么这是一种合理的异步方法吗?这个场景将是几种方法--Jason,Mitch和Mike - 在没有阻塞的情况下并发运行并在完成后继续执行事件处理程序?我应该注意哪些关于我天真实现异常处理的注意事项?是否有任何问题或潜在问题需要注意?
private async void button1_Click(object sender,EventArgs e)
{
try
{
AsyncJason c1 = new AsyncJason();
await c1.Hello();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public class AsyncJason
{
public AsyncJason()
{
}
public async Task Hello()
{
var j = await GetJasonAsync();
string[] dankeSchon = await Task.WhenAll(new Task<string>[] {GetJasonAsync(), GetMikeAsync(), GetMitchAsync()});
}
private async Task<string> GetJasonAsync()
{
var result = await Task.Run<string>(() => GetJason());
return result;
}
private string GetJason()
{
return "Jason";
}
private …Run Code Online (Sandbox Code Playgroud)