任何人都可以解释为什么,如果一个C++应用程序运行一个.NET UI组件(所有在主线程上),它反过来产生一个模态.NET对话框,然后尝试TaskScheduler.FromCurrentSynchronizationContext();在一个Task.Factory.StartNew调用中使用该任务在一个工作线程上运行?如果我没有显示对话框或者在显示对话框之前存储了上下文,则不会发生这种情况.
我试图创建一个虚拟程序来显示它但失败了,我认为它可能与一个主进程是COM有关.
有任何想法吗?
好的,我的代码看起来像这样
private void RunStateMachine(IQ4UpgraderState State)
{
_State = State;
Task.Factory.StartNew(() => StateMachine(), _TokenSource.Token, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}
private void StateMachine()
{
switch (_State)
{
//Some Code
}
}
Run Code Online (Sandbox Code Playgroud)
当任务启动时,当前上下文是主线程,但是当StateMachine调用运行时,它在工作线程上,当且仅当 我在运行此代码之前打开了模式对话框时.TaskScheduler.FromCurrentSynchronizationContext()返回的上下文在启动任务时似乎是正确的.我甚至比较了两种情况下返回的内容,似乎没有区别.
这似乎是一个显而易见的事情,但是我已经把大部分头发都拉出来试图在网上找到任何例子或自己做.
我有19个项目的ac#解决方案和运行构建脚本的Jenkins构建服务器来驱动MSBuild.MSBuild当然会根据输入与输出确定需要编译和不需要编译的内容.
我正在尝试创建一个自定义目标来有条件地更新MSBuild将要编译的那些项目的AssemblyInfo.cs以增加文件版本.当然,我想让这些项目不是单独编译的.
我知道如何在每次运行的CoreBuild之前注入一个目标,所以如果有一些变量我可以测试一下是否会发生可以工作的编译.我也知道如何确定编译是否运行,因此有条件地进行一些可能但不理想的后处理.
我如何调整构建过程来实现这一目标?
由于似乎没有直接回答这个问题,有没有人知道如何执行与MSBuild相同的逻辑来确定哪些项目需要重建?
或者,是否有一些其他SVN客户端具有探索器易用性,但也支持Vista/Windows7中不再提供的SVN详细信息列?
我简要地看了一下像Explorer ++,FreeCommander,Xplorer2 lite这样的东西,但似乎都没有这样的支持.
我只想要一个快速,简单和免费的解决方案,以便在订购文件列表时查看已经添加/修改的内容,这些列已经证明是非常有用的.
我最近将我的 C# 解决方案之一从 VS2008 更新到 VS 2010,以利用嵌入式互操作类型功能,这样我就可以停止提供目前由于与旧版 VB6 代码库交互而必须使用的互操作库。
由于某种原因,我在编译解决方案时收到以下消息:
类型库导入程序遇到不是从 IUnknown 派生的接口:“_HiddenInterface”
我进行了搜索,到目前为止我能找到的唯一两条信息是“忽略它,它不会造成任何伤害”和“这意味着 VB6 代码违反了一些规则”。由于 VB 代码库是我们的,并且最好在编译时出现 0 个警告,因此我想纠正导致这些警告的任何原因。
我很茫然,所以任何建议都会很好。
希望问题很清楚,但为了清楚起见,请将其填写清楚:
我有一个VB6 dll定义了我在C#dll中引用的枚举.C#dll以正确的方式定义CCW,其中idispatch接口声明了一个函数,其返回类型是枚举.
运行regasm时,我收到一个警告,表明枚举不是COM可见,因此不会导出该函数.因为它是在我的VB6库中定义的,所以我认为它已经是COM可见的,因为它是在COM dll中定义的.
我意识到我可以停止搞乱并使用一个int传递枚举,只是做任何一个结束,但它是适当的令人沮丧,我想知道一种方式是否存在.
根据要求,这里有一些示例代码:
VB6 dll定义了一个枚举
Public Enum myEnum
first = 0
second = 1
End Enum
Run Code Online (Sandbox Code Playgroud)
这通过interop导入到C#中,如果您查看元数据,它看起来像这样
[Guid("EnumGUID")]
public enum myEnum
{
first = 0,
second = 1
}
Run Code Online (Sandbox Code Playgroud)
然后定义CCW接口
[ComVisible(true)]
[Guid("InterfaceGuid")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyCCWInterface
{
[DispId(1)]
myEnum myFunction();
}
Run Code Online (Sandbox Code Playgroud)
Regasm抱怨myEnum不可见.我必须同意它,因为元数据视图没有com visible属性.奇怪的是,如果我在VB dll中使用其他类型定义函数的参数我没有抱怨,它似乎是枚举,我猜它是因为我实际上暴露了VB6枚举的交错实现而不是实际的枚举.
所以我想我理解这个问题,我想知道的是,如果有一种方法可以使用不涉及黑客攻击任何中间或自动生成的代码的枚举.
我正在尝试为Action创建一个方便的扩展方法,以便在延迟后基本上运行该操作:到目前为止,我的扩展看起来像这样
public static void DelayAction(this Action DelayedAction, int millisecondDelay, CancellationToken Token)
{
Task t = Task.Factory.StartNew(() => { Thread.Sleep(millisecondDelay); }, Token, TaskCreationOptions.None, TaskScheduler.Default);
t.ContinueWith(_ => DelayedAction, Token, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}
Run Code Online (Sandbox Code Playgroud)
我有一个函数我调用它反过来使用这些扩展
private void DelayTask(Action ActiontoDelay, int millisecondDelay)
{
ActiontoDelay.DelayAction(millisecondDelay, _TokenSource.Token);
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
DelayTask(() => { _SomeFunction(SomeArgs); }, 1500);
Run Code Online (Sandbox Code Playgroud)
但这一切似乎都落到了整体而且行动从未触发过.我哪里错了?
编辑17-11-11 2300hrs:
我删除了通用扩展方法,因为它与此示例无关.
此处也发表评论,因为它没有在评论中清楚地格式化代码
如果不是通话
DelayTask(() => { _SomeFunction(SomeArgs); }, 1500);
Run Code Online (Sandbox Code Playgroud)
我直接这样做:
Task t = Task.Factory.StartNew(() => { Thread.Sleep(1500); }, Token, TaskCreationOptions.None, TaskScheduler.Default);
t.ContinueWith(() => { _SomeFunction(SomeArgs); }, Token, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); …Run Code Online (Sandbox Code Playgroud)