我正在尝试使用TPL Dataflow来创建管道.到目前为止一切正常,我的管道定义如下(虽然我的问题只是广播员,submissionSucceeded,submissionFailed):
// Define tasks
var productListingBatchBuffer = new BufferBlock<PostSubmissionState>();
var splitFile = new TransformBlock<PostSubmissionState, PostSubmissionState>(s => SplitFile(s));
var saveFile = new TransformBlock<PostSubmissionState, PostSubmissionState>(s => SaveFile(s));
var postSubmission = new TransformBlock<PostSubmissionState, PostSubmissionState>(s => PostSubmission(s));
var broadcaster = new BroadcastBlock<PostSubmissionState>(state => state);
var submissionSucceeded = new ActionBlock<PostSubmissionState>(s => SubmissionSucceeded(s));
var submissionFailed = new ActionBlock<PostSubmissionState>(s => SubmissionFailed(s));
// Link em up
productListingBatchBuffer.LinkTo(splitFile, new DataflowLinkOptions() { PropagateCompletion = true });
splitFile.LinkTo(saveFile, new DataflowLinkOptions() { PropagateCompletion = true });
saveFile.LinkTo(postSubmission, new DataflowLinkOptions() { PropagateCompletion …Run Code Online (Sandbox Code Playgroud) 我糊涂了.从表面上看,在C#中执行事务似乎很简单.从这里:
http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleTransactionClass.htm
string constr = "User Id=scott;Password=tiger;Data Source=oracle";
OracleConnection con = new OracleConnection(constr);
con.Open();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT COUNT(*) FROM MyTable";
// Start a transaction
OracleTransaction txn = con.BeginTransaction(
IsolationLevel.ReadCommitted);
try
{
// Insert the same row twice into MyTable
cmd.CommandText = "INSERT INTO MyTable VALUES (1)";
cmd.ExecuteNonQuery();
cmd.ExecuteNonQuery(); // This may throw an exception
txn.Commit();
}....
Run Code Online (Sandbox Code Playgroud)
因此,创建一个连接,在该连接上开始一个事务,然后关闭,直到你想要提交或回滚.
但是,其他来源,例如:
https://forums.oracle.com/thread/319121
提倡设置OracleCommand对象本身的Transaction属性.例如
cmd.Transaction = txn;
Run Code Online (Sandbox Code Playgroud)
还有其他消息来源说这个属性是只读的.它实际上并不是只读的,但似乎没有任何地方可以清楚地说出它的作用.
因此,我的困惑是OracleCommand对象上存在Transaction属性似乎表明它应该用作执行该命令作为事务的一部分,但Oracle自己的文档不使用此属性.那有什么用呢?
所以我的问题是:
我正在尝试创建一个Windows窗体,我可以删除文件/文件夹.
我在WinForms应用程序中有以下代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_DragEnter(object sender, DragEventArgs e)
{
Debug.Print("DragEnter");
}
private void Form1_DragDrop(object sender, DragEventArgs e)
{
MessageBox.Show("Dropped!");
}
}
Run Code Online (Sandbox Code Playgroud)
我已将AllowDrop属性设置为true.我已经尝试在Visual Studio中的调试中运行该应用程序.基于其他类似问题的答案,我尝试以管理员身份运行已编译的exe.我已经尝试不以管理员身份运行已编译的exe .
但无论我做什么,我都无法触发DragDrop事件.但是,DragEnter事件会触发.我错过了什么?
以下屏幕截图是查看比屏幕宽的文本文件的 Visual Studio 代码:
屏幕底部有一个水平滚动条(几乎)可见。我发现这很难看(我只花了 20 分钟寻找如何添加水平滚动条,因为我什至不知道它在那里)。事实上,默认情况下,如果窗口没有焦点,它会逐渐消失。在以下(未记录的)设置中对此进行了修复:
"editor.scrollbar.horizontal": "visible"
Run Code Online (Sandbox Code Playgroud)
但是,我仍然觉得这并不令人满意。有什么办法可以改善这种情况吗?例如,Visual Studio 本身的滚动条就很好。
(注意:我知道自动换行,但这不是我想要的。)
TPL Dataflow提供了非常有用的功能:
public static IPropagatorBlock<TInput, TOutput> Encapsulate<TInput, TOutput>(
ITargetBlock<TInput> target,
ISourceBlock<TOutput> source)
Run Code Online (Sandbox Code Playgroud)
使您能够将多个块封装到单个转换块中.它返回一个
IPropagatorBlock<TInput, TOutput>
Run Code Online (Sandbox Code Playgroud)
它代表管道的起始和结束块.
但是,如果我的管道中的最后一个块是ActionBlock,我不能使用它,因为ActionBlock不是SourceBlock,并且函数的返回类型将是ITargetBlock,而不是IPropagatorBlock.
基本上,我正在寻找的是这样的功能:
public static ITargetBlock<TStart> Encapsulate<TStart, TEnd>(
ITargetBlock<TStart> startBlock,
ActionBlock<TEnd> endBlock)
Run Code Online (Sandbox Code Playgroud)
这是一个明智的事情,或者我错过了一些简单的东西?我不太清楚如何来写呢-尤其是类设置完成.我需要创建自己的自定义块类型吗?
编辑:
好的,所以看过@Panagiotis Kanavos的回复,做了一些修补,我想出了这个.这基于EncapsulatingPropagator类,它是现有DataflowBlock.Encapsulate方法使用的类:
internal sealed class EncapsulatingTarget<TStart, TEnd> : ITargetBlock<TStart>
{
private readonly ITargetBlock<TStart> startBlock;
private readonly ActionBlock<TEnd> endBlock;
public EncapsulatingTarget(ITargetBlock<TStart> startBlock, ActionBlock<TEnd> endBlock)
{
this.startBlock = startBlock;
this.endBlock = endBlock;
}
public Task Completion
{
get { return this.endBlock.Completion; }
}
public void Complete()
{
this.startBlock.Complete();
}
void IDataflowBlock.Fault(Exception …Run Code Online (Sandbox Code Playgroud) 我已经阅读了大量关于如何使属性线程安全的讨论和示例.这个线程安全包装类的页面上有一个
给出的例子是这样的:
internal class MyThreadSafeCass
{
// *** Lock ***
private object PropertyLock = new object();
// *** Property ***
private int m_Property = 0;
// *** Thread-safe access to Property using locking ***
internal int Property
{
get
{
lock (PropertyLock)
{
return m_Property;
}
}
set
{
lock (PropertyLock)
{
m_Property = value;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
很清楚这里发生了什么,以及锁在做什么,但我很难理解它为什么需要它.为什么以下不是线程安全的?什么可能出错?
internal class MyThreadSafeCass
{
// *** Property ***
private int m_Property = 0;
// *** Thread-safe …Run Code Online (Sandbox Code Playgroud) 我有一个 SQL Server 数据库项目 (VS2017),在项目属性中,SQLCMD 变量选项卡如下所示:
问题:我可以创建一个 SQLCMD 变量并为其设置一个默认值和一个本地值。有什么不同?
注意:我目前确实在我的项目中使用 SQLCMD 变量,所以我想我知道它们是如何工作的,但我无法理解这种区别。根据我可以找到的文档(突出显示是我的):
在 SQL Server 数据库项目中,您可以利用 SQLCMD 变量提供用于调试或发布的动态替换。您输入变量名称和值,在构建期间,这些值将被替换。如果没有本地值,将使用默认值。通过在项目属性中输入这些变量,它们将自动在发布中提供并存储在发布配置文件中。您可以通过加载值按钮将变量的项目值拉入发布。
所以看起来:
这对我有什么帮助?设置两个值似乎没有意义,那么为什么我们需要两个不同的值呢?
我在我的App.Config中设置了一些自定义配置部分,这样我现在有一个看起来像这样的configSection.
<configSections>
<section name="Section1" type="ConfigSections.MySection, MyNamespace"/>
<section name="Section2" type="ConfigSections.MySection, MyNamespace"/>
<section name="Section3" type="ConfigSections.MySection, MyNamespace"/>
</configSections>
Run Code Online (Sandbox Code Playgroud)
我想要做的是在代码中阅读本节,以便在运行时找出我有哪些部分.我试过了:
var mySections = ConfigurationManager.GetSection("configSections");
Run Code Online (Sandbox Code Playgroud)
但是这会返回null.我确定我错过了一些简单的东西,但我找不到任何关于如何做到这一点的事情.
谢谢
我正在使用Oracle 11g.以下语句大约需要3秒钟才能执行:
select case when regexp_like(
'blahblahblahblah.blah@blah-blah.blah.gov.uk',
'^[\-a-zA-Z0-9_''^&\+\?\:]+(\.?[\-a-zA-Z0-9_''^&\+\?\:]+)*@([a-zA-Z0-9]+\.)+[a-zA-Z]{2,3}$')
then 'true' else 'false' end
Run Code Online (Sandbox Code Playgroud)
在电子邮件地址中添加另一个字符:
'blahblahblahblah.blahx@blah-blah.blah.gov.uk'
Run Code Online (Sandbox Code Playgroud)
需要6秒.另一个角色12,然后是24,48,依此类推.所以:
'blahblahblahblah.blahxxxxx@blah-blah.blah.gov.uk'
Run Code Online (Sandbox Code Playgroud)
运行大约需要96秒.
但是,删除连字符:
'blahblahblahblah.blahxxxxx@blahblah.blah.gov.uk'
Run Code Online (Sandbox Code Playgroud)
它会立即运行.
谁知道这里发生了什么?
我正在尝试使用PowerShell运行一些单元测试.我有一个命令(有点)工作:
$output = & $vsTestPath $TestAssembly $logger $TestCaseFilter 2>&1
Run Code Online (Sandbox Code Playgroud)
这样做的问题是标准输出和标准错误流没有以正确的顺序出现 - 它们混淆了.对此的一个解决方案(从这里)是使用cmd.exe,但我不能让它工作.我觉得我已经尝试了所有我能想到的东西.
这就是我所拥有的:
$vsTestPath = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe"
$TestAssembly = "C:\IntegrationTesting\Test Application\Ads.Slms.IntegrationTesting.Web.Smartfill.dll"
$output = & cmd.exe /c $vsTestPath $TestAssembly 2`>`&1
Run Code Online (Sandbox Code Playgroud)
最后一行不起作用.很奇怪,如果我有
$output = & cmd.exe /c $vsTestPath 2`>`&1
Run Code Online (Sandbox Code Playgroud)
然后就跑了,但当然对我没用.这是问题的第二个参数.我试过的其他事情.我怎么能让它运行?
$output = & cmd.exe /c $vsTestPath $TestAssembly 2`>`&1
$output = & cmd.exe /c $vsTestPath,$TestAssembly 2`>`&1
$output = & cmd.exe /c "$vsTestPath" $TestAssembly 2`>`&1
$output = & cmd.exe /c """$vsTestPath""" $TestAssembly 2`>`&1
$output = & cmd.exe /c …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用C#和Visual Studio 2017创建我的第一个iOS应用程序,并且在尝试连接到mac时收到以下错误:
"必须接受Xcode许可证才能与Mac连接并正常工作."
我假设这意味着我必须在Mac上安装Xcode,但我找不到任何提及此的教程,或者如何开始.即使您转到Visual Studio 2017的Microsoft文档,也链接到此页面:
https://msdn.microsoft.com/en-us/library/dn879698.aspx
你最终在这个页面上:
它没有提及XCode,并告诉你,"要开始,请安装Visual Studio 2015".
我四处寻找教程,但找不到任何教程.我可以在Mac上安装XCode,但是我不想在不知道我正在做什么的情况下盲目地安装东西.
谁能指出我正确的方向?
我觉得这个问题的答案是由于我对线程如何工作的概念不正确,但是这里有.
private void button1_Click(object sender, EventArgs e)
{
this.TestMethodAsync(); // No await, i.e. fire and forget
// ** Some code here to perform long running calculation (1) **
}
private async Task TestMethodAsync()
{
// Some synchronous stuff
await Task.Delay(1000);
// ** Some code here to perform long running calculation (2) **
}
Run Code Online (Sandbox Code Playgroud)
首先,我不会"发射并忘记"这样的异步方法(我会使用Task.Run),但我遇到的代码确实存在,我试图了解效果是什么.
在使用a的WinForms应用程序中,WindowsFormsSynchronizationContext我对async和await的理解告诉我,当我单击button1时,该方法将在UI线程上同步启动.它会TestMethodAsync同步调用和运行,直到它到达等待状态.然后它将捕获上下文,启动Task.Delay任务,并将控制权交给调用者.由于我们没有等待此调用,因此button1_Click将继续在UI线程上开始执行计算(1).
在某些时候,Task.Delay(1000)将完成.然后,继续将TestMethodAsync使用捕获的上下文运行方法的其余部分,在这种情况下,意味着将继续在UI线程上运行.现在开始执行计算(2).
我们现在有两个独立的代码段,希望同时在同一个线程(UI线程)上运行.我对此的调查似乎表明,线程在代码的两个部分之间来回切换,以便同时执行它们.
题:
我对这里到底发生了什么感到困惑.如何在已经运行其他代码的线程上恢复?是什么迫使线程在想要运行的两段代码之间切换?通常,当您尝试在已经运行其他代码的线程上恢复时会发生什么?
(我想这与我的点击事件首先在UI线程上运行的方式没有任何不同,因为我知道它在UI线程上运行,我知道UI线程也在做其他事情,但是我之前没有真正考虑过它.)
c# ×7
tpl-dataflow ×2
.net ×1
app-config ×1
asynchronous ×1
cmd ×1
exception ×1
ios ×1
oracle ×1
oracle11g ×1
powershell ×1
regex ×1
transactions ×1
winforms ×1
xamarin ×1
xcode ×1