由于各种原因,我经常发现编写与.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中)Tuple<...> (不是在.NET 3.5中)Lazy<T>和Lazy<T,TMetadata>(不是在.NET 3.5中)Reflection.Emit (缺少.NETCF;不是一个小功能,但我非常想念它)我有一个超过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) 如果方法在一段有限的时间内没有完成,我需要停止执行.
要做这项工作,我可以这样使用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) 是否可以使用Reactive Extensions(Rx)在.NET 3.5中创建执行并行化的应用程序,还是以某种方式限制?我从http://www.microsoft.com/download/en/confirmation.aspx?id=26649下载了Rx ,在创建了一个带引用的反应式程序集的简单项目之后,我找不到与.NET 4.0中的任务相对应的任何类.我正在尝试为"任务"找到课程,但唉,我找不到任何课程.难道我做错了什么?
我有一个由事件处理程序启动的函数。在这个函数中,一个新任务被创建并运行以设置一个我稍后需要的全局变量,在另一个事件处理程序中。
这两个函数之间还有其他几个函数,它们不会更改其中使用的任何变量。但这就是它的样子。
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 …
我有许多线程需要运行(大约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),然后等待所有线程完成,然后继续执行程序的其余部分.