在null对象上调用Any()时,它会在C#中抛出ArgumentNullException.如果对象为null,那么肯定没有'any',它应该返回false.
为什么C#以这种方式运行?
我在我的项目中使用了一个可视化控件,它来自一个我没有源代码的库.
更新(大约200ms)以获得良好的UI响应时间需要很长时间,其中三个控件同时在屏幕上显示.(我可能需要一次更新所有三个,这使得我的UI在他们都在思考的时候停留了大约600毫秒).
我已经阅读了一些关于TaskSchedulers的帖子,并开始研究并行任务功能,作为在自己的线程中运行每个控件的一种方式.该平台将是多核的,所以我想利用同步处理.
问题是我甚至不知道我不知道如何解决这个问题.
是否有合适的设计模式用于在WPF中的主UI线程的单独线程中运行控件?
具体来说:它是第三方地图控件,当给定新位置或缩放级别时需要太长时间才能重绘(~200ms).可能有三个更新最多4Hz - 显然它们不会跟上..
我已经在用户控件中封装了WPF控件,并且需要在它自己的线程中运行每个实例,同时仍然捕获用户输入(鼠标点击, 例如).
更新:虽然我正在寻找解决方案,但到目前为止我已实施了以下内容.
我的主(UI)线程产生一个线程,该线程创建一个包含相关控件的新窗口,并将其定位在正确的位置(这样它看起来只是一个普通的控件).
_leftTopThread = new Thread(() =>
{
_topLeftMap = new MapWindow()
{
WindowStartupLocation = WindowStartupLocation.Manual,
Width = leftLocation.Width,
Height = leftLocation.Height,
Left = leftLocation.X,
Top = leftLocation.Y,
CommandQueue = _leftMapCommandQueue,
};
_topLeftMap.Show();
System.Windows.Threading.Dispatcher.Run();
});
_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
Run Code Online (Sandbox Code Playgroud)
哪个CommandQueue是线程安全的BlockingCollection队列,用于向地图发送命令(移动位置等).
现在的问题是,我可以任
System.Windows.Threading.Dispatcher.Run()呼叫而有用户输入我无法等待命令,因为它会吸收我所有的线程CPU!
是否有可能阻止并有事件消息泵的工作?
position流上属性的(整个)文档说:
- 在派生类中重写时,获取或设置当前流中的位置.
- Position属性不跟踪已消耗,跳过或两者的流中的字节数.
而已.好了,我们什么也没有告诉我们相当清楚,但是我真的很想知道它其实并不代表.什么是"位置" 的?我们为什么要改变或阅读它?如果我们改变它 - 会发生什么?
在一个实际的例子中,我有一个定期写入的流,我有一个尝试从中读取的线程(理想情况下是ASAP).通过阅读许多SO问题,我将position字段重置为零以开始阅读.完成后:
也许我不理解Stream本身 - 我将它视为FIFO管道:将数据推入一端,然后将其吸收到另一端.如果它不是这样的话,那么我是否必须将数据复制到我上次读取之后(即从位置0x84开始)回到缓冲区的开头?
我已经认真地试图研究所有这些 - 但是我是.NET的新手.也许Streams有一个漫长而自豪(无证)的历史,其他人都暗中理解.但是对于一个新手来说,这就像阅读手册到你的车,并找出:
加速踏板影响送到燃油喷射器的燃油和空气量.它不会影响娱乐系统的音量,也不会影响任何轮胎的气压(如果安装).
技术上是真的,但严肃地说,我们想要知道的是,如果我们将它捣碎到地板上你会更快 ..
编辑 - 更大的图片
我有来自串行端口,套接字或文件的数据,并且有一个线程在那里等待新数据,并将其写入一个或多个流 - 都是相同的.
我可以从另一台PC的telnet会话访问其中一个流,并且一切正常.
我现在遇到的问题是在同一程序中的代码中解析数据(在另一个重复的流上).我正在将数据复制到MemoryStream,并有一个线程来坐下并解密数据,然后将其传递回UI.这个线程dataStream.BeginRead()进入它自己的缓冲区,它返回一些(?)数量的数据,但不超过count参数.在处理了我从中获得的任何内容后BeginRead,我将剩余的数据(从我的读取点的末尾到流的末尾)复制到缓冲区的开头,这样它就不会溢出.
此时,由于写入和读取都是异步的,我不知道是否可以改变位置(因为它是'光标' - 感谢Jon).即使发送消息给其他线程说,我刚读28个字节,或什么-它不会知道哪些他们是28个字节,并且将不知道如何重置它的光标/ position.我没有子类化任何流 - 我刚刚创建了一个MemoryStream,并将其传递给线程,该线程将数据复制到所需的任何流中.
这一切都感觉太复杂了,无法做到这一点 - 我只是找不到一个我可以根据需要修改的简单例子.
人们如何处理需要发送到其他任何不能立即执行的任务的长期零星数据流?
编辑:可能的解决方案
在由于答案中的信息而尝试在队列中编写Stream包装器时,我偶然发现了Stephen Toub发布的这篇文章.
他写了一篇BlockingStream,并解释说:
.NET Framework中的大多数流都不是线程安全的,这意味着多个线程无法同时安全地访问流的实例,并且大多数流保持单个位置,在该位置将发生下一次读取或写入.另一方面,BlockingStream是线程安全的,并且在某种意义上,它隐式地保持两个位置,尽管它们都没有作为数值暴露给该类型的用户.BlockingStream通过维护写入它的数据缓冲区的内部队列来工作.将数据写入流时,写入的缓冲区将排队.当从流中读取数据时,缓冲区以先进先出(FIFO)顺序出列,并且其中的数据被传递回调用者.从这个意义上说,流中有一个位置,下一次写入将发生,下一次读取将发生.
这似乎正是我所寻找的 - 所以感谢答案的人,我只从你的答案中找到了这个.
我需要在x64窗口下创建和访问一个spaceite扩展的SQLite数据库.
我已经下载了所谓的最新版本1.0.92.0 sqlite-netFx45-static-binary-bundle-x64-2012-1.0.92.0.zip 的System.Data.SQLite.它是从我的Visual Studio(2012)项目中引用的,并且它本身似乎工作得很好.
我还有最新的预编译x64 spatiaLite版本4.1.1,名为spatialite-4.1.1-DLL-win-amd64.zip来自spatialite的所有dll都存在于执行目录中.
当我尝试加载扩展时:
using (var conn = new SQLiteConnection("Data Source=\"" + _sqLiteFullName + "\""))
{
conn.Open();
conn.EnableExtensions(true);
conn.LoadExtension("libspatialite-4.dll");
...
}
Run Code Online (Sandbox Code Playgroud)
我得到一个AccessViolationException(试图读取受保护的内存.这通常表明其他内存已损坏)LoadExtension().
我注意到使用PE Deconstructor(确定dll/exe的bitnewss的软件),它说我的System.Data.SQLite.dll(来自x64包)的副本实际上是32位.那是问题吗?
我该如何解决这个问题?
有没有其他人让spatiaLite在x64上工作?
我基本上希望让我的WPF窗口进入全屏模式,按下F11或按下窗口右上角的最大化按钮.
虽然以下工作就像按F11的魅力:
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.F11)
{
WindowStyle = WindowStyle.None;
WindowState = WindowState.Maximized;
ResizeMode = ResizeMode.NoResize;
}
}
Run Code Online (Sandbox Code Playgroud)
这仍将显示Windows任务栏(使用Windows 7测试):
protected override void OnStateChanged(EventArgs e)
{
if (WindowState == WindowState.Maximized)
{
WindowStyle = WindowStyle.None;
WindowState = WindowState.Maximized;
ResizeMode = ResizeMode.NoResize;
}
base.OnStateChanged(e);
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?或者我可以做得更优雅吗?
我的问题与此非常相似.
我在Interface Builder中使用故事板设计的自定义原型单元将所有内部对象设置为nil(未创建),因此当我尝试为它们分配值时,它们保持空白.
我正在使用Xcode 4.6.2,并在6.1 iPhone模拟器中运行代码.这就是我所做的:
此时,表格显示正确的部分和行数,但未设置单元格的值.
这是cellForRowAtIndexPath:(NSIndexPath *)indexPath代码:
NewServerCell *cell = [tableView dequeueReusableCellWithIdentifier:@"serverNameCell"];
Run Code Online (Sandbox Code Playgroud)
我总是回到一个单元格,内存位置似乎可以用于有效对象.
但是当我试图cell.name.text = [thisServer name];找到cell.name标签总是零时.
没有崩溃 - 但我的领域没有被设置.
我已经检查了一百万次标识符是好的 - 它是!我已经浏览了故事板中的自定义单元格的Apple文档 - 但仍然遇到这个令人沮丧的问题..
其他人有这个,并解决了吗?
我很难过.
我正在尝试获取一个人拥有的所有电子邮件地址列表.我正在使用它ABPeoplePickerNavigationController来选择这个人,这一切似乎都很好.我正在设置我的
ABRecordRef personDealingWith;
Run Code Online (Sandbox Code Playgroud)
从person论证到
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切似乎都很好.下面的代码第一次执行,一切都很好.随后运行时,我可以解决问题.一,代码:
// following line seems to make the difference (issue 1)
// NSLog(@"%d", ABMultiValueGetCount(ABRecordCopyValue(personDealingWith, kABPersonEmailProperty)));
// construct array of emails
ABMultiValueRef multi = ABRecordCopyValue(personDealingWith, kABPersonEmailProperty);
CFIndex emailCount = ABMultiValueGetCount(multi);
if (emailCount > 0) {
// collect all emails in array
for (CFIndex i = 0; i < emailCount; i++) {
CFStringRef emailRef = ABMultiValueCopyValueAtIndex(multi, i);
[emailArray addObject:(NSString *)emailRef];
CFRelease(emailRef);
}
}
// following line …Run Code Online (Sandbox Code Playgroud) 我在使用Visual Studio 2012的Windows 7计算机上编写了一个.NET 4.5应用程序,它在Windows 7上安装并运行良好.
当我尝试在Windows 8机器上部署它时,它崩溃非常灾难性,在事件查看器中没有非常有用的输出.
具有Dependency walker的跟踪表明它无法在一个/一些核心Windows dll中找到方法.例如:
LoadLibraryExW("C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscoreei.dll", 0x0000000000000000, LOAD_WITH_ALTERED_SEARCH_PATH) returned 0x00007FFDEA780000.
GetProcAddress(0x00007FFDEA780000 [MSCOREEI.DLL], "RegisterShimImplCallback") called from "MSCOREE.DLL" at address 0x00007FFDEA82F3A9 and returned 0x00007FFDEA783444.
GetProcAddress(0x00007FFDEA780000 [MSCOREEI.DLL], "RegisterShimImplCleanupCallback") called from "MSCOREE.DLL" at address 0x00007FFDEA82F3BC and returned NULL. Error: The specified procedure could not be found (127).
Run Code Online (Sandbox Code Playgroud)
在检查mscoreei.dll时,我注意到:
Windows 7机器
v4.0.30319.18408
613,456字节
Windows 8机器
v4.0.30319.33440
633,424字节
两台机器(根据ASoft .NET版本检测器)都有.NET 4.5 Full.
为什么我的机器有不同的.NET版本,如何确保Windows 7机器上的编译器针对Windows 8机器的正确版本?
在我的 WPF ListBox 中,我有一个带有 ListBoxItem 的 ControlTemplate 的样式。在那个 ControlTemplate 里面,我定义了一个标签。根据一些细节,我需要更改标签的字体大小。所以从我的代码隐藏中,我需要确定字体应该是什么,然后我需要设置它。
这是我使用 ControlTemplate 的风格(我去掉了一些不相关的控件)
<Style x:Key="RecordTabList" TargetType="{x:Type ListBoxItem}">
<Setter Property="Background" Value="{DynamicResource RecordIndexTabBackcolor}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Label
x:Name="myLabel" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1" Margin="3,-2,0,-2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Foreground="{DynamicResource RecordIndexTabForeground}"
FontSize="10" Height="Auto" BorderThickness="3,0,0,0"
Content="{Binding Path=Name}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我有一个简单的请求,我花了很多时间(令人尴尬)..
我已经对UITableView进行了分类以添加一些功能.这些新功能需要像NSMutableSet这样需要分配/初始化的东西.
我把对象的初始化例程放在了
- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
Run Code Online (Sandbox Code Playgroud)
我从苹果文档中理解为正确 - 但这不会被调用(通过对代码的断点来确定).
我正在使用IB,并将其拖到UITableView视图上,并将其类更改为我的新子类.没有UITableViewController.我也尝试过:
- (void)loadView {
- (id)init {
- (id)initWithFrame:(CGRect)frame {
Run Code Online (Sandbox Code Playgroud)
没有成功.我希望这个课程既可以使用IB,也可以在将来以编程方式工作.一切都与这个初始化的位置有关.
我想从我的.net应用程序更新.dbf文件.我能够将.dbf文件读入网格,但无法从我的.net应用程序更新.dbf文件.
我使用以下代码来读取.dbf文件.读书还可以.但是,无法更新.dbf文件.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.Odbc;
namespace DBFwin
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ConnectToDBF()
{
System.Data.Odbc.OdbcConnection oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=D:\databases\;Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
oConn.Open();
System.Data.Odbc.OdbcCommand oCmd = oConn.CreateCommand();
//Test.DBF is the dbf file which is located at C:\rd\Setup folder.
oCmd.CommandText = @"SELECT * FROM C:\rd\Setup\Test.DBF";
DataTable dt = new DataTable();
dt.Load(oCmd.ExecuteReader());
//Adding …Run Code Online (Sandbox Code Playgroud) c# ×7
.net ×4
wpf ×3
ios ×2
iphone ×2
objective-c ×2
uitableview ×2
.net-4.5 ×1
addressbook ×1
asp.net ×1
blocking ×1
contacts ×1
database ×1
dbf ×1
fullscreen ×1
gis ×1
ienumerable ×1
memory-leaks ×1
memorystream ×1
object ×1
position ×1
spatialite ×1
sqlite ×1
storyboard ×1
stream ×1
windows-8.1 ×1
winforms ×1