相关疑难解决方法(0)

"兼容包"用于向后移植新的.NET Framework功能?

由于各种原因,我经常发现编写与.NET framework 2.0或3.5兼容或与.NET Compact Framework兼容的代码是可取的,但是新的.NET框架中有许多"小"特性是一个问题.在旧框架或Compact Framework中不可用.

例如,我发现扩展方法确实很有用,但编译器依赖System.Runtime.CompilerServices.ExtensionAttribute于此.您可以自己轻松定义此属性,然后在.NET Framework 2.0中使用扩展方法(在C#3.0+下).同样的,这是不是太硬手动定义小.NET 4种类型,如Tuple<T1,T2>和Lazy<T>.顺便说一句,如果你想在.NET 2.0中使用LINQ,你可以使用LinqBridge.

现在假设你ExtensionAttribute公开,以便你编写的其他程序集可以使用它.一开始就没问题,但是如果你想使用也有同样想法的第三方库呢?您添加对该库的引用,现在您有名称冲突.哎呀.

我还注意到一些新的库只适用于.NET 4.0或3.5,即使它们只有很小的依赖关系,可以使用兼容包或LinqBridge来解决.

如果旧的.NET版本的"兼容包"在一个小DLL中定义了这些小功能,你可以证明包括在任何规模的项目中,这肯定会很好.这样的事情存在吗?

更新:从沉默来判断,我想没有这样的事情.如果有兴趣,我可能会自己创建这样一个OSS库.所以我的新问题是,如果你在为.NET 2,.NET 3.5,.NETCF或Silverlight编写,你会想念.NET 4的哪些小功能(而不是像WCF/WPF这样的怪物)?我将开始列表......

  • ExtensionAttribute (不是在.NET 2中)
  • Func<...>和Action<...>代表(不在.NET 2中)
  • LINQ到对象(不在.NET 2中)
  • Tuple<...> (不是在.NET 3.5中)
  • Lazy<T>和Lazy<T,TMetadata>(不是在.NET 3.5中)
  • 表达式树(不在.NET 2中;在.NET 3.5中不完整)
  • 泛型方差(存在于.NET 2中,但无法从C#3和VB 9中访问)
  • Reflection.Emit (缺少.NETCF;不是一个小功能,但我非常想念它)

.net compatibility compact-framework .net-3.5 .net-2.0

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

如何优化大尺寸的循环

我有一个超过20k迭代的for循环,每次迭代需要大约两到三秒,总共大约20分钟.我如何优化这个循环.我正在使用.net3.5所以并行foreach是不可能的.所以我将200000 nos分成小块并实现了一些线程,现在我可以将时间缩短50%.有没有其他方法来优化这种for循环.

我的示例代码如下

    static double sum=0.0;
    public double AsyncTest()
    {
            List<Item> ItemsList = GetItem();//around 20k items
            int count = 0;
            bool flag = true;
            var newItemsList = ItemsList.Take(62).ToList();
            while (flag)
            {
                int j=0;
                WaitHandle[] waitHandles = new WaitHandle[62];
                foreach (Item item in newItemsList)
                {
                    var delegateInstance = new MyDelegate(MyMethod);
                    IAsyncResult asyncResult = delegateInstance.BeginInvoke(item.id, new AsyncCallback(MyAsyncResults), null);
                    waitHandles[j] = asyncResult.AsyncWaitHandle;
                    j++;
                }
                WaitHandle.WaitAll(waitHandles);
                count = count + 62;
                newItemsList = ItemsList.Skip(count).Take(62).ToList();  
            }
            return sum;
    }

    public double MyMethod(int id)
    {
        //Calculations …
Run Code Online (Sandbox Code Playgroud)

c# performance .net-3.5

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

如何在特定时间后停止执行某个方法?

如果方法在一段有限的时间内没有完成,我需要停止执行.

要做这项工作,我可以这样使用Thread.Abort方法:

void RunWithTimeout(ThreadStart entryPoint, int timeout)
{
    var thread = new Thread(() =>
    {
        try
        {
            entryPoint();
        }
        catch (ThreadAbortException)
        {   }

    }) { IsBackground = true };

    thread.Start();

    if (!thread.Join(timeout))
        thread.Abort();
}
Run Code Online (Sandbox Code Playgroud)

鉴于我使用的是.NET 3.5,还有更好的方法吗?

编辑:跟随我的评论entryPoint,但我正在寻找一个好方法entryPoint.

void entryPoint()
{
   // I can't use ReceiveTimeout property
   // there is not a ReceiveTimeout for the Compact Framework
   socket.Receive(...);
}
Run Code Online (Sandbox Code Playgroud)

c# c#-3.0

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

Threading.Tasks在.NET 3.5中的Rx扩展模拟?

是否可以使用Reactive Extensions(Rx)在.NET 3.5中创建执行并行化的应用程序,还是以某种方式限制?我从http://www.microsoft.com/download/en/confirmation.aspx?id=26649下载了Rx ,在创建了一个带引用的反应式程序集的简单项目之后,我找不到与.NET 4.0中的任务相对应的任何类.我正在尝试为"任务"找到课程,但唉,我找不到任何课程.难道我做错了什么?

c# .net-3.5 system.reactive

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

任务和全局变量 C#

我有一个由事件处理程序启动的函数。在这个函数中,一个新任务被创建并运行以设置一个我稍后需要的全局变量,在另一个事件处理程序中。

这两个函数之间还有其他几个函数,它们不会更改其中使用的任何变量。但这就是它的样子。

private void EventWhereINeedTheGlobalVariableLater(object sender, Event e)
{
    //...work...

    need _variableIneed


    //....more work...
}


private void EventWhereISetGlobalVariable(object sender, Event e)
{
    //....work....
    //...make cancellationToken...
    //groups, isCommonalityGroup are other global variables already set. 

    Task.Factory.StartNew(() =>
    {
        // Clear variable to get new value
        _variableIneed = null;

        // Execute query to get new value
        _variableIneed = _workingManager.GetValue(groups, isCommonalityGroup, cancellationToken);

       RefreshView();

    }, cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)

我遇到了竞争条件,我需要的变量_variableIneed在第二个事件处理程序中为空,而它不能。如果我没有飞过并试图创建足够的事件来使 wpf 程序崩溃,它就可以正常工作,但是即使我这样做了,我也需要它工作。

我能做些什么来克服这些竞争条件吗?

我试过使用 的.ContinueWith选项OnlyOnRanToCompletion或任何它是。还有什么我可以尝试的吗?

**注意,我无法改变事件的排序/处理/处理方式。这是一个非常固定的石头设计,我只需要解决它并或多或少地保持原样。

**更新

我也试过ParallelExtensionsExtras在OrderedTaskScheduler …

c# wpf scheduled-tasks

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

等待线程完成后再继续

我有许多线程需要运行(大约160)创建文件,然后将它们复制到不同的地方:

'Files is basically a list of strings
'which is passed to a function that creates a file from a number of database fields
'when thats done it copies it to a number of places

       For Each x In Files
            Dim Evaluator = New Thread(Sub() API.Files.Create.Standard(x))
            Evaluator.Start()
        Next
Run Code Online (Sandbox Code Playgroud)

我想要它做的是触发160个左右的线程(带有许可者x),然后等待所有线程完成,然后继续执行程序的其余部分.

vb.net multithreading

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