我正在尝试以编程方式将C#4中的异步操作链接起来,例如写入给定的Stream对象.我最初是"手动"执行此操作,将回调挂钩从一个操作到下一个操作,但我想我会尝试使用.NET 4任务并行库来省去重新发明并发轮的麻烦.
首先,我将异步调用包装在Tasks中,如下所示:
public static Task CreateWriteTask(Stream stream, byte[] data)
{
return Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, data, 0, data.Length, null);
}
Run Code Online (Sandbox Code Playgroud)
Continuations使链接同步操作变得非常容易(如果您原谅不幸的方法名称):
public static Task ChainFlush(Stream stream, Task precedingTask)
{
return precedingTask.ContinueWith(x => stream.Flush());
}
Run Code Online (Sandbox Code Playgroud)
但是没有任何版本的Task.ContinueWith方法可以像接受同样的方式接受异步操作TaskFactory.FromAsync.
所以,假设我坚持使用TPL,我正在寻找这种方法的正确实现:
public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask)
{
//?
}
Run Code Online (Sandbox Code Playgroud) 这段代码片段是我的类生成代码的简化摘录,它创建了两个类,它们作为泛型类型中的参数相互引用:
namespace Sandbox
{
using System;
using System.Reflection;
using System.Reflection.Emit;
internal class Program
{
private static void Main(string[] args)
{
var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.Run);
var module = assembly.DefineDynamicModule("Test");
var typeOne = module.DefineType("TypeOne", TypeAttributes.Public);
var typeTwo = module.DefineType("TypeTwo", TypeAttributes.Public);
typeOne.DefineField("Two", typeof(TestGeneric<>).MakeGenericType(typeTwo), FieldAttributes.Public);
typeTwo.DefineField("One", typeof(TestGeneric<>).MakeGenericType(typeOne), FieldAttributes.Public);
typeOne.CreateType();
typeTwo.CreateType();
Console.WriteLine("Done");
Console.ReadLine();
}
}
public struct TestGeneric<T>
{
}
}
Run Code Online (Sandbox Code Playgroud)
哪个应该产生相当于以下的MSIL:
public class TypeOne
{
public Program.TestGeneric<TypeTwo> Two;
}
public class TypeTwo
{
public Program.TestGeneric<TypeOne> One;
}
Run Code Online (Sandbox Code Playgroud)
但是反而抛出了这个异常typeOne.CreateType():
System.TypeLoadException was …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Powershell脚本,它执行我的构建/部署过程中的一个步骤,它需要在远程计算机上运行一些操作.该脚本相对复杂,因此如果在远程活动期间发生错误,我需要详细的堆栈跟踪,指出错误发生在脚本中的位置(超出已经生成的日志记录).
问题在于,当从远程机器中继终止异常时,Invoke-Command丢失堆栈跟踪信息.如果在本地计算机上调用脚本块:
Invoke-Command -ScriptBlock {
throw "Test Error";
}
Run Code Online (Sandbox Code Playgroud)
返回所需的异常详细信息:
Test Error
At C:\ScriptTest\Test2.ps1:4 char:2
+ throw "Test Error";
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Test Error:String) [], RuntimeException
+ FullyQualifiedErrorId : Test Error
Run Code Online (Sandbox Code Playgroud)
但如果远程运行:
Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
throw "Test Error";
}
Run Code Online (Sandbox Code Playgroud)
异常堆栈跟踪指向整个Invoke-Command块:
Test Error
At C:\ScriptTest\Test2.ps1:3 char:1
+ Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Test Error:String) [], RuntimeException
+ FullyQualifiedErrorId : Test Error
Run Code Online (Sandbox Code Playgroud)
我可以手动将异常传回本地机器:
$exception = Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
try …Run Code Online (Sandbox Code Playgroud) 我正在为Vulkan开发C#绑定,其中包括一组示例项目,这些项目呈现简单的形状以演示API调用.这些项目作为WinForms应用程序运行,将Forms的HWND传递给Vulkan以附加Surface对象以创建交换链.
我有一个请求提供一个作为UWP应用程序运行的示例项目,但是当我运行项目(将所有代码移植到UWP可移植库之后)并从Vulkan API返回成功代码时,没有任何内容出现在UWP应用程序窗口中.我正在使用此问题中描述的方法从UWP CoreWindow获取Vulkan Surface的HWND,示例代码上传到https://github.com/FacticiusVir/SharpVk/blob/UWP/SharpVk/SharpVk. HelloTriangle.Uwp/MainPage.xaml.cs中 -不幸的是,我不能挑出特定的部分代码来报价,因为我不知道在哪里该项目的问题所在.
因此,总结一下 - 是否可以将Vulkan用作UWP应用程序的渲染器,如果是这样,我该怎么办呢?