小编Kir*_*ril的帖子


Application.LoadComponent的线程错误(密钥已存在)

MSDN说System.Windows.Application的公共静态成员是线程安全的.但是当我尝试使用多个线程运行我的应用程序时,我得到以下异常:

ArgumentException: An entry with the same key already exists.

   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.SortedList`2.Add(TKey key, TValue value)
   at System.IO.Packaging.Package.AddIfNoPrefixCollisionDetected(ValidatedPartUri partUri,
        PackagePart part)
   at System.IO.Packaging.Package.GetPartHelper(Uri partUri)
   at System.IO.Packaging.Package.GetPart(Uri partUri)
   at System.Windows.Application.GetResourceOrContentPart(Uri uri)
   at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean 
bSkipJournaledProperties)
       at System.Windows.Application.LoadComponent(Uri resourceLocator)
Run Code Online (Sandbox Code Playgroud)

以下调用发生异常:

genericResources = (ResourceDictionary)Application.LoadComponent(new Uri("/Themes/Generic.xaml", UriKind.Relative));
Run Code Online (Sandbox Code Playgroud)

该应用程序在单个线程上工作正常,甚至在两个或三个上.当我从5点起床后,每次都会收到错误.难道我做错了什么?我该怎么做才能解决这个问题?

c# wpf multithreading thread-safety

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

锁定aqcuired并进一步尝试锁定不阻塞:C#锁是否重入?

我已经编写了一个测试,我认为应该是一个有效的死锁案例.看来,一旦lock已经被一个类的实例获取,该实例就不再需要重新获取lock,即使我明确地尝试再次调用另一个方法lock.

这是班级:

internal class Tester
{
    private readonly object _sync = new object();

    public Tester() { }

    public void TestLock()
    {
        lock (_sync)
        {
            for (int i = 0; i < 10; i++)
            {
                Deadlock(i);
            }
        }

    }

    private void Deadlock(int i)
    {
        lock (_sync)
        {
            Trace.WriteLine(i + " no deadlock!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

0没有死锁!
1没有死锁!
2没有死锁!
3没有死锁!
4没有死锁!
5没有死锁!
6没有死锁!
7没有死锁!
8没有死锁!
9没有死锁!

我本以为这会导致僵局......任何人都能对此有所了解吗?

.net c# concurrency multithreading deadlock

20
推荐指数
2
解决办法
3659
查看次数

C#using语句是否执行try/finally?

假设我有以下代码:

private void UpdateDB(QuoteDataSet dataSet, Strint tableName)
{
    using(SQLiteConnection conn = new SQLiteConnection(_connectionString))
    {
        conn.Open();
        using (SQLiteTransaction transaction = conn.BeginTransaction())
        {
            using (SQLiteCommand cmd = new SQLiteCommand("SELECT * FROM " + tableName, conn))
            {
                using (SQLiteDataAdapter sqliteAdapter = new SQLiteDataAdapter())
                {
                    sqliteAdapter.Update(dataSet, tableName);
                }
            }
            transaction.Commit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

C#文档声明,通过using语句,范围内的对象将被处理,并且我已经看到了几个建议我们不需要使用try/finally子句的地方.

我通常用try/finally包围我的连接,并且我总是关闭finally子句中的连接.鉴于上述代码,如果存在异常,假设连接将被关闭是否合理?

c# using exception using-statement

17
推荐指数
3
解决办法
7915
查看次数

OpenThemeData函数有哪些可能的类?

我正在尝试调用OpenThemeData(参见msdn OpenThemeData)函数,但我无法确定pszClassList参数传递的可接受的类名是什么.

HTHEME OpenThemeData(      
    HWND hwnd,
    LPCWSTR pszClassList
);
Run Code Online (Sandbox Code Playgroud)

有谁能告诉我可以传递给该参数的可接受的类名是什么?谢谢!

c++ winapi msdn mfc themes

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

C++通过Const引用并通过Const引用返回

我试图了解返回const引用是否有任何好处.我有一个通常看起来像这样的阶乘函数:

unsigned long factorial(unsigned long n)
{
    return (n == 0) ? 1 : n * factorial(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

我假设当我们通过const引用传递并且返回const引用时会有性能提升......但是 - const正确性总是让我感到困惑.

const unsigned long & factorial(const unsigned long& n)
{
    return (n == 0) ? 1 : n * factorial(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

返回const引用是否有效?还有,有人可以告诉我:这有益吗?

c++ reference const-correctness pass-by-reference

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

如何在与其可执行文件相同的文件夹中启动进程

我正在尝试以编程方式启动应用程序,但它始终在我的应用程序的文件夹中运行...例如:

如果我的应用程序位于C:\ MyApp\myapp.exe而其他应用程序位于C:\ OtherApp\otherapp.exe中,如何在其所在的文件夹中启动其他应用程序,而不是在其中的文件夹中我的应用程序驻留?

以下是我启动其他应用的方法:

private void StartApp(OtherApp application)
{
    Process process = new Process();
    process.StartInfo.FileName = application.FileName;
    process.StartInfo.Arguments = application.AppName;
    process.Start();
}
Run Code Online (Sandbox Code Playgroud)

c# directory executable process

9
推荐指数
3
解决办法
8922
查看次数

应该为BeginInvoke的@object参数传递什么?

我有一个事件委托,定义如下:

public delegate void CallbackDelegate(Data data);
public event CallbackDelegate OnDataComplete;
Run Code Online (Sandbox Code Playgroud)

我以异步方式引发事件:

// Raise the OnDataComplete event
OnDataComplete.BeginInvoke(new Data(), null, null);
Run Code Online (Sandbox Code Playgroud)

随后,签名BeginInvoke看起来像:

IAsyncResult CallbackDelegate.BeginInvoke(Data data, AsyncCallback callback, object @object)
Run Code Online (Sandbox Code Playgroud)

在我看到的大多数示例中都BeginInvoke使用@object参数调用null,但是我找不到解释该参数用途的文档.

那么该参数的目的是什么?我们可以用它做什么?

c# events multithreading delegates begininvoke

9
推荐指数
3
解决办法
5293
查看次数

Windows字体大小何时更改C++ MFC时无法检测

我正在尝试确定当用户将Windows字体大小从正常字体更改为超大字体时如何检测,通过在Windows XP计算机上执行以下步骤来选择字体大小:

  1. 右键单击桌面,然后选择"属性".
  2. 单击"外观"选项卡.
  3. 选择字体大小:正常/大字体/超大字体

我的理解是字体大小的变化会导致DPI的变化,所以这是我到目前为止所尝试的.


我的目标:

我想检测Windows字体大小何时从正常变为大或超大字体,并根据字体大小更改采取一些操作.我假设当Windows字体大小改变时,DPI也会改变(特别是当大小为超大字体时)


到目前为止我尝试过的:

我收到几条消息,包括:WM_SETTINGCHANGE,WM_NCCALCSIZE,WM_NCPAINT等......但是当字体大小改变时,这些消息都不是唯一的,换句话说,当我收到WM_SETTINGSCHANGE消息时,我想知道改变了什么.

理论上,当我定义OnSettingChange并且Windows调用它时,lpszSection应该告诉我更改的部分是什么,并且工作正常,但是我通过调用SystemParametersInfo检查给定的部分并且我传递了动作SPI_GETNONCLIENTMETRICS,然后我逐步完成调试器和我确保我在返回的NONCLIENTMETRICS中观察任何字体更改的数据,但没有发生.

即使这不起作用,我仍然可以在设置更改时检查DPI.我真的不在乎其他细节,每次我收到WM_SETTINGCHANGE消息,我只会检查DPI并执行我感兴趣的操作,但我也无法获得系统DPI.

我试图通过调用方法GetSystemMetrics来获取DPI,也为每个DC:

Dekstop DC-> GetDeviceCaps LOGPIXELSX/LOGPIXELSY窗口DC-> GetDeviceCaps LOGPIXELSX/LOGPIXELSY当前DC-> GetDeviceCaps LOGPIXELSX/LOGPIXELSY

即使我在图形属性窗口中更改DPI,这些值也不会返回任何不同的值,它们总是显示96.

有人能帮我解决这个问题吗?我应该寻找什么?我应该在哪里看?

afx_msg void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{
    int windowDPI = 0;
    int deviceDPI = 0;
    int systemDPI = 0;
    int desktopDPI = 0;
    int dpi_00_X = 0;
    int dpi_01_X = 0;
    int dpi_02_X = 0;
    int dpi_03_X = 0;

    CDC* windowDC = CWnd::GetWindowDC(); // try with window DC
    HDC desktop = ::GetDC(NULL); // try with …
Run Code Online (Sandbox Code Playgroud)

c++ winapi mfc font-size system-font

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

使用Castle Windsor在ASP.NET MVC中设置控制反转(IoC)

我正在讨论Sanderson的Pro ASP.NET MVC框架,在第4章他讨论了创建一个自定义控制器工厂,似乎现在不推荐使用原始方法,AddComponentLifeStyleAddComponentWithLifeStyle用于注册控制器:

public class WindsorControllerFactory : DefaultControllerFactory
{
    IWindsorContainer container;

    public WindsorControllerFactory()
    {
        container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

        // register all the controller types as transient
        var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                              where typeof(IController).IsAssignableFrom(t)
                              select t;

        //[Obsolete("Use Register(Component.For<I>().ImplementedBy<T>().Named(key).Lifestyle.Is(lifestyle)) instead.")]
        //IWindsorContainer AddComponentLifeStyle<I, T>(string key, LifestyleType lifestyle) where T : class;
        foreach (Type t in controllerTypes)
        {
            container.Register(Component.For<IController>().ImplementedBy<???>().Named(t.FullName).LifeStyle.Is(LifestyleType.Transient));
        }
    }

    // Constructs the controller instance needed to service each request
    protected override IController …
Run Code Online (Sandbox Code Playgroud)

reflection asp.net-mvc castle-windsor inversion-of-control

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