我发现F#2.0显然不再支持公共静态字段,这使得标准的实现方式变得不可能DependencyProperty:
public static readonly FooProperty = DependencyProperty.Register(...); // in C#
Run Code Online (Sandbox Code Playgroud)
我不太喜欢F#的一个建议解决方法,它涉及将DependencyPropertya 声明为a static mutable val然后用static do... 初始化它(或者不管它究竟是什么).
我已经尝试将一个DependencyProperty公共静态属性公开,而不是公共静态字段,这似乎在WPF应用程序中工作得很好(我已经在属性上尝试了数据绑定和样式设置器,两者都成功):
type XY() =
inherit Control()
static let fooProperty =
DependencyProperty.Register("Foo", typeof<string>, typeof<XY>)
static member public FooProperty with get () = fooProperty // see update below:
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // not required!
member public this.Foo with get (): string = this.GetValue(fooProperty) :?> string
and set (x: string) = …Run Code Online (Sandbox Code Playgroud) 我从使用StreamReader的Web服务器得到响应...现在我想解析这个响应(它是一个XML文档文件)来获取它的值,但每次我尝试这样做时都会收到一个错误:缺少根元素.
如果我直接读取相同的XML文件,文件格式正确,我可以读取它.
这是流:
WebResponse response = webRequest.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader responseReader = new StreamReader(responseStream);
string responseString = responseReader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)
这就是我尝试读取XML文件的方式:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(responseReader);
XmlNodeList address = xmlDoc.GetElementsByTagName("original");
Run Code Online (Sandbox Code Playgroud) 首先请注意,此问题未标记为winforms或wpf或其他任何GUI特定的.这是故意的,你很快就会看到.
第二,对不起,如果这个问题有点长.我尝试将各种各样的信息汇集在一起,以便提供有价值的信息.然而,我的问题正好在"我想知道的事情"之下.
我的任务是最终了解.NET提供的在特定线程上调用委托的各种方法.
我正在寻找最通用的方法(不是Winforms或WPF特定的)来调用特定线程上的委托.
或者,换句话说:我会感兴趣的是,以及如何做各种各样的方式(例如通过WPF Dispatcher)相互利用; 也就是说,如果所有其他人都使用了一种用于跨线程委托调用的通用机制.
有很多与此主题相关的课程; 其中:
SynchronizationContext (in System.Threading)
如果我不得不猜测,那将是最基本的一个; 虽然我不明白它到底是做什么,也不知道它是如何使用的.
AsyncOperation&(in )
这些似乎是包装.不知道如何使用它们.AsyncOperationManager System.ComponentModelSynchronizationContext
WindowsFormsSynchronizationContext (in System.Windows.Forms)
的子类SynchronizationContext.
ISynchronizeInvoke (in System.ComponentModel)
由Windows窗体使用.(Control该类实现了这个.如果我不得不猜测,我会说这个实现可以使用WindowsFormsSynchronizationContext.)
Dispatcher&(in )
似乎后者是另一个子类,前者代表它.DispatcherSynchronizationContext System.Windows.ThreadingSynchronizationContext
有些线程有自己的消息循环,还有消息队列.
(MSDN页面关于消息和消息队列有一些介绍消息循环如何在系统级工作的背景信息,即消息队列作为Windows API.)
我可以看到如何为具有消息队列的线程实现跨线程调用.使用Windows API,您可以将消息放入特定线程的消息队列PostThreadMessage,其中包含调用某个委托的指令.消息循环 - 在该线程上运行 - 最终将到达该消息,并且将调用该委托.
根据我在MSDN上阅读的内容,线程不会自动拥有自己的消息队列.消息队列将变为可用,例如当线程创建窗口时.没有消息队列,线程没有消息循环是没有意义的.
那么,当目标线程没有消息循环时,是否可以进行跨线程委托调用?比方说,在.NET控制台应用程序中?(从这个问题的答案来看,我认为控制台应用确实不可能.)
.net winapi multithreading system.componentmodel synchronizationcontext
我目前正忙着为现有技术实现流畅的界面,这将允许类似于以下代码段的代码:
using (var directory = Open.Directory(@"path\to\some\directory"))
{
using (var file = Open.File("foobar.html").In(directory))
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
为了实现这样的构造,需要使用类来累积参数并将它们传递给其他对象.例如,要实现Open.File(...).In(...)构造,您需要两个类:
// handles 'Open.XXX':
public static class OpenPhrase
{
// handles 'Open.File(XXX)':
public static OpenFilePhrase File(string filename)
{
return new OpenFilePhrase(filename);
}
// handles 'Open.Directory(XXX)':
public static DirectoryObject Directory(string path)
{
// ...
}
}
// handles 'Open.File(XXX).XXX':
public class OpenFilePhrase
{
internal OpenFilePhrase(string filename)
{
_filename = filename
}
// handles 'Open.File(XXX).In(XXX):
public FileObject In(DirectoryObject directory)
{
// ...
} …Run Code Online (Sandbox Code Playgroud) .net performance garbage-collection fluent-interface runtime
我设计了框架的数据访问部分,以便每次业务对象(BO)需要与数据库交互时,都必须打开连接,调用数据访问层(执行查询),然后关闭连接.然后,如果需要在事务中运行,它将打开连接,开始事务,调用数据访问层(执行查询),然后提交事务,关闭事务,最后关闭连接.
我这样做的方式是"开放晚,早关闭" ...但是如果我需要调用其他BO在单个交易中提交数据怎么办?有没有更好的方法来处理打开和关闭连接以及处理事务?
我是设计应用程序架构的新手,所以我希望我不会错误地做这个......任何帮助都是值得赞赏的.
我Dictionary在VBScript中有一个对象.如何将其中包含的所有对象复制到新的Dictionary,即创建字典的克隆/复制?
#include <stdio.h>
char toUpper(char);
int main(void)
{
char ch, ch2;
printf("lowercase input : ");
ch = getchar();
ch2 = toUpper(ch);
printf("%c ==> %c\n", ch, ch2);
return 0;
}
char toUpper(char c)
{
if(c>='a'&&c<='z')
c = c - 32;
}
Run Code Online (Sandbox Code Playgroud)
在toUpper函数中,返回类型为char,但toUpper()中没有"return".并使用gcc(GCC)4.5.1 20100924(Red Hat 4.5.1-4),fedora-14编译源代码.
当然,发出警告:"警告:控制到达无效功能的结束",但是,运行良好.
在使用gcc编译期间,代码中发生了什么?在这种情况下,我想得到一个可靠的答案.谢谢 :)
我正在使用端口在Mac OS上安装meld.
它已下载所有依赖项并告知一切正常:
Staging meld into destroot
Installing meld @1.5.3_0
Activating meld @1.5.3_0
Cleaning meld
Updating database of binaries: 100.0%
Scanning binaries for linking errors: 100.0%
No broken files found.
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时:
[18:28:24]~$ meld
Run Code Online (Sandbox Code Playgroud)
Traceback(最近一次调用最后一次):
File "/opt/local/bin/meld", line 75, in <module>
locale.setlocale(locale.LC_ALL,'')
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 539, in setlocale
return _setlocale(category, locale)
locale.Error: unsupported locale setting
Run Code Online (Sandbox Code Playgroud)
问题是什么以及如何处理?
是否有一个优雅的解决方案来遍历有序列表,对当前和下一个对象进行一些计算?LINQ必须有一个更聪明的方法来执行以下操作:
public static List<double> GetHoursBetweenDates(List<DateTime> aDates)
{
List<double> lst = new List<double>();
var olst = aDates.OrderByDescending(d => d).ToList();
for (int i = 0; i < olst.Count - 1; i++)
{
lst.Add(olst[i].Subtract(olst[i+1]).TotalHours);
}
return lst;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个只能调用一次的线程安全方法(每个对象实例).如果之前已调用异常,则应抛出异常.
我想出了两个解决方案.他们都是正确的吗?如果没有,他们有什么问题?
用lock:
public void Foo()
{
lock (fooLock)
{
if (fooCalled) throw new InvalidOperationException();
fooCalled = true;
}
…
}
private object fooLock = new object();
private bool fooCalled;
Run Code Online (Sandbox Code Playgroud)public void Foo()
{
if (Interlocked.CompareExchange(ref fooCalled, 1, 0) == 1)
throw new InvalidOperationException();
…
}
private int fooCalled;
Run Code Online (Sandbox Code Playgroud)
如果我没有弄错的话,这个解决方案具有无锁的优点(在我的情况下似乎无关紧要),并且它需要更少的私有字段.
我也愿意接受合理的意见,哪些解决方案应该是首选的,并且如果有更好的方法可以提出进一步的建议.
.net ×6
c# ×3
ado.net ×1
c ×1
clone ×1
connection ×1
datetime ×1
dictionary ×1
diff ×1
f# ×1
gcc ×1
install ×1
interlocked ×1
linq ×1
linux ×1
macos ×1
meld ×1
performance ×1
port ×1
runtime ×1
streamreader ×1
timespan ×1
transactions ×1
vbscript ×1
winapi ×1
wpf ×1
xml ×1