小编bor*_*egg的帖子

在TPL数据流中使用BroadcastBlock复制异常

我正在尝试使用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# exception tpl-dataflow

32
推荐指数
1
解决办法
796
查看次数

使用C#和ODP.NET执行Oracle事务

我糊涂了.从表面上看,在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自己的文档不使用此属性.那有什么用呢?

所以我的问题是:

  1. 我是否需要设置OracleCommand的Transaction属性,如果是,那究竟是做什么的?
  2. 如果我在连接上启动了一个事务,那么即使我没有在这些命令上设置Transaction属性,那么在该连接上执行所有后续命令(直到提交或回滚)为该事务的一部分?

c# transactions oracle11g oraclecommand

11
推荐指数
1
解决办法
1万
查看次数

拖放不适用于C#Winforms Application

我正在尝试创建一个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事件触发.我错过了什么?

c# drag-and-drop winforms

11
推荐指数
3
解决办法
1万
查看次数

使水平滚动条在 Visual Studio 代码中更加可见

以下屏幕截图是查看比屏幕宽的文本文件的 Visual Studio 代码:

在此处输入图片说明

屏幕底部有一个水平滚动条(几乎)可见。我发现这很难看(我只花了 20 分钟寻找如何添加水平滚动条,因为我什至不知道它在那里)。事实上,默认情况下,如果窗口没有焦点,它会逐渐消失。在以下(未记录的)设置中对此进行了修复:

"editor.scrollbar.horizontal": "visible"
Run Code Online (Sandbox Code Playgroud)

但是,我仍然觉得这并不令人满意。有什么办法可以改善这种情况吗?例如,Visual Studio 本身的滚动条就很好。

(注意:我知道自动换行,但这不是我想要的。)

visual-studio-code vscode-settings

9
推荐指数
1
解决办法
3595
查看次数

使用TPL Dataflow封装以动作块结尾的管道

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)

c# task-parallel-library tpl-dataflow

6
推荐指数
1
解决办法
1712
查看次数

关于在c#中设置简单属性的非线程安全是什么?

我已经阅读了大量关于如何使属性线程安全的讨论和示例.这个线程安全包装类的页面上有一个

给出的例子是这样的:

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)

c# multithreading thread-safety

5
推荐指数
1
解决办法
123
查看次数

SQL Server 数据库项目属性中的本地和默认 SQLCMD 变量有什么区别?

我有一个 SQL Server 数据库项目 (VS2017),在项目属性中,SQLCMD 变量选项卡如下所示:

在此处输入图片说明

问题:我可以创建一个 SQLCMD 变量并为其设置一个默认值一个本地值。有什么不同?

注意:我目前确实在我的项目中使用 SQLCMD 变量,所以我想我知道它们是如何工作的,但我无法理解这种区别。根据我可以找到的文档(突出显示是我的):

在 SQL Server 数据库项目中,您可以利用 SQLCMD 变量提供用于调试或发布的动态替换。您输入变量名称和值,在构建期间,这些值将被替换。如果没有本地值,将使用默认值。通过在项目属性中输入这些变量,它们将自动在发布中提供并存储在发布配置文件中。您可以通过加载值按钮将变量的项目值拉入发布。

所以看起来:

  • 如果您只有一个默认值,则将使用该值
  • 如果您只有一个 Local 值,则将使用该值
  • 如果两者都有,则将始终使用Local 值。

这对我有什么帮助?设置两个值似乎没有意义,那么为什么我们需要两个不同的值呢?

database-project visual-studio sql-server-data-tools

5
推荐指数
1
解决办法
777
查看次数

如何阅读configSections

我在我的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.我确定我错过了一些简单的东西,但我找不到任何关于如何做到这一点的事情.

谢谢

c# app-config

4
推荐指数
1
解决办法
9096
查看次数

正则表达式挂起在Oracle 11g中

我正在使用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)

它会立即运行.

谁知道这里发生了什么?

regex oracle

4
推荐指数
1
解决办法
229
查看次数

从PowerShell运行cmd.exe

我正在尝试使用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)

powershell cmd

4
推荐指数
1
解决办法
3万
查看次数

尝试选择Xamarin代理时,必须接受Xcode许可证错误

我正在尝试使用C#和Visual Studio 2017创建我的第一个iOS应用程序,并且在尝试连接到mac时收到以下错误:

"必须接受Xcode许可证才能与Mac连接并正常工作."

我假设这意味着我必须在Mac上安装Xcode,但我找不到任何提及此的教程,或者如何开始.即使您转到Visual Studio 2017的Microsoft文档,也链接到此页面:

https://msdn.microsoft.com/en-us/library/dn879698.aspx

你最终在这个页面上:

https://docs.microsoft.com/en-us/visualstudio/cross-platform/cross-platform-mobile-development-in-visual-studio

它没有提及XCode,并告诉你,"要开始,请安装Visual Studio 2015".

我四处寻找教程,但找不到任何教程.我可以在Mac上安装XCode,但是我不想在不知道我正在做什么的情况下盲目地安装东西.

谁能指出我正确的方向?

xcode ios xamarin visual-studio-2017

1
推荐指数
1
解决办法
1736
查看次数

当异步代码尝试在已经执行的线程上恢复时会发生什么?

我觉得这个问题的答案是由于我对线程如何工作的概念不正确,但是这里有.

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线程也在做其他事情,但是我之前没有真正考虑过它.)

.net c# multithreading asynchronous

1
推荐指数
1
解决办法
242
查看次数