据我所知,Thread.Sleep(0)强制操作系统上下文切换.
我想检查在接收一些CPU时间之前可以在应用程序中传递的最长时间.
所以我构建了一个在while循环(c#)中执行Thread.Sleep(0)的应用程序,并计算每次调用之间传递的时间.
当此应用程序是在双核测试PC上运行的唯一应用程序时,最大观察时间不到1毫秒(平均为0.9微秒)并且它使用所有可用的CPU(100%).
当我沿着CPU填充虚拟应用程序(所有具有相同优先级)运行它时,最大时间约为25毫秒,平均时间为20毫秒.它的行为与我期望的完全一样.而且时间非常稳定.
每当它获得一些CPU时间时,它会立即将控制权交给任何有进行某些处理的人,这就像烫手山芋游戏(CPU使用率下降到0%).如果没有其他应用程序运行,则控件立即返回.
鉴于此行为,我预计此应用程序对运行实际应用程序的计算机的影响最小.(并且给我实际的"延迟",我期望在那里运行的应用程序中看到).但令我惊讶的是,它确实对这个特定系统的性能产生了负面影响(以可观察的方式).
我错过了一些关于Thread.Sleep(0)的重要观点吗?
作为参考,这里是该应用程序的代码
private bool _running = true;
private readonly Stopwatch _timer = new Stopwatch();
private double _maxTime;
private long _count;
private double _average;
private double _current;
public Form1()
{
InitializeComponent();
Thread t = new Thread(Run);
t.Start();
}
public void Run()
{
while(_running)
{
_timer.Start();
Thread.Sleep(0);
_timer.Stop();
_current = _timer.Elapsed.TotalMilliseconds;
_timer.Reset();
_count++;
_average = _average*((_count - 1.0)/_count) + _current*(1.0/_count);
if(_current>_maxTime)
{
_maxTime = _current;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为清晰起见而编辑(应用程序的目的): 我目前正在运行一个软实时多线程应用程序(以及一组应用程序),它们需要每隔大约300毫秒对一些输入作出反应,但我们不时会错过一些截止日期(不到1%的时间)我正在努力提高这个数字.
我想验证在同一台机器上由其他过程引起的当前变化是什么:我通过在上面的半实时机器上安装上面描述的应用程序来强调,观察到的最大时间将告诉我系统引起的变化.IE我有300毫秒但是在线程获得一些CPU时间之前的最大观察时间是50毫秒,所以为了提高性能,我应该将处理时间设置为最大250毫秒(因为我可能已经晚了50毫秒).
在我的应用程序中,我有一个活动和服务...该服务将广播从GPS数据收集的消息...活动应该接收广播消息并更新UI ...
我的代码
public class LocationPollerDemo extends Activity {
private static final int PERIOD = 10000; // 30 minutes
private PendingIntent pi = null;
private AlarmManager mgr = null;
private double lati;
private double longi;
private ServiceReceiver serviceReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mgr = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, LocationPoller.class);
i.putExtra(LocationPoller.EXTRA_INTENT, new Intent(this, ServiceReceiver.class));
i.putExtra(LocationPoller.EXTRA_PROVIDER, LocationManager.GPS_PROVIDER);
pi = PendingIntent.getBroadcast(this, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);
DebugLog.logTrace("On Create Demo");
Toast.makeText(this, "Location polling every 30 …Run Code Online (Sandbox Code Playgroud) 我试过这样做,但这只显示了旁边没有文字的单选按钮.
<% foreach (string s in Html.RadioButtonList("rbl")) {%>
<% =s %>
<% } %>
Run Code Online (Sandbox Code Playgroud) 我在使用SQL Server 2000,2005和2008的Web应用程序中使用实体框架.当我使用2008以外的任何东西创建新的EDMX文件时(我创建的第一个edmx版本)我收到error 0172: All SSDL artifacts must target the same provider. The Provider 'MyDatabase' is different from ' MyDatabase ' that was encountered earlier.它似乎在代码中的某个地方连接连接到2008数据存储区,当它检查SSDL文件并看到不同的ProviderManifestToken值时,它会抛出此错误.我有点沮丧.很难想象EF只能在每个应用程序中使用单个版本的Sql Server.我相当肯定必须有一个设置或解决方法.有没有人有解决方案在单个Web应用程序中使用不同版本的SQL Server和Entity Framework?
我刚刚升级到新版本的gmail(v2.3.5),我有一个应用程序查询内容提供商,以获取有关收到消息的联系人的详细信息......
使用最新版本我收到以下错误:
java.lang.SecurityException:Permission Denial:从ProcessRecord打开提供程序com.google.android.gm.provider.MailProvider {40adef58 3576:com.rageconsulting.android.lightflow/10056}(pid = 3576,uid = 10056)需要com. google.android.gm.permission.READ_GMAIL或com.google.android.gm.permission.WRITE_GMAIL`
对于我的清单中的gmail,我声明了以下内容:
<!--permissions for gmail-->
<uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="com.google.android.providers.gmail.permission.READ_GMAIL"/>
<uses-permission android:name="com.google.android.gm.permission.READ_GMAIL"/>
<uses-permission android:name="com.google.android.gm.permission.WRITE_GMAIL"/>
Run Code Online (Sandbox Code Playgroud)
所以据我所知,我的权限是正确的.
我的gmail接收器如下所示:
<receiver android:name=".receiver.GmailReceiver">
<intent-filter>
<action android:name="android.intent.action.PROVIDER_CHANGED" android:priority="-10">
</action>
<data android:scheme="content" android:host="gmail-ls" android:pathPattern="/unread/.*">
</data>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PROVIDER_CHANGED" android:priority="-10">
</action>
<data android:mimeType="*/*" android:scheme="content" android:host="gmail-ls" android:path="/unread/^i">
</data>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
谁能想到我可能错过的东西?
EF已经为我生成了一些部分类,每个都有一个构造函数,但它表示不要触摸它们(下面的示例),现在如果我创建自己的辅助部分类并且我想要一个构造函数自动设置一些字段如何我会这样做,因为它会发生冲突吗?
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Breakdown.Models
{
using System;
using System.Collections.Generic;
public partial class Call
{
public Call()
{
this.Logs = new HashSet<Log>();
}
...
}
}
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚这是否是可接受的操作.我需要从SQL Server 2008数据库中选择记录然后删除它们,所有这些都是ASP.NET代码中的单个事务.请注意,.NET代码必须能够检索首先选择的数据.
这样的东西:
SELECT * FROM [tbl] WHERE [id] > 6;
DELETE FROM [tbl] WHERE [id] > 6
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用SQL Fiddle,但如果我这样做:
SELECT * FROM [tbl]
Run Code Online (Sandbox Code Playgroud)
我得到了完整的表格,好像没有删除任何内容.
编辑按照下面的要求,这里是检索记录的完整.NET代码:
string strSQLStatement = "SELECT * FROM [tbl] WHERE [id] > 6;" +
"DELETE FROM [tbl] WHERE [id] > 6";
using (SqlCommand cmd = new SqlCommand(strSQLStatement, connectionString))
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//Read values
val0 = rdr.GetInt32(0);
val3 = rdr.GetInt32(3);
//etc.
}
}
}
Run Code Online (Sandbox Code Playgroud) 使用实体框架6.0.2和.NET 4.5.1在Visual Studio中2013更新1与DbContext连接到SQL Server:
我有一长串过滤器,我根据调用者的期望结果应用于查询.一切都很好,直到我需要添加分页.这是一瞥:
IQueryable<ProviderWithDistance> results = (from pl in db.ProviderLocations
let distance = pl.Location.Geocode.Distance(_geo)
where pl.Location.Geocode.IsEmpty == false
where distance <= radius * 1609.344
orderby distance
select new ProviderWithDistance() { Provider = pl.Provider, Distance = Math.Round((double)(distance / 1609.344), 1) }).Distinct();
if (gender != null)
{
results = results.Where(p => p.Provider.Gender == (gender.ToUpper() == "M" ? Gender.Male : Gender.Female));
}
if (type != null)
{
int providerType;
if (int.TryParse(type, out providerType)) …Run Code Online (Sandbox Code Playgroud) 最近我发现C#的运算符%适用于double.尝试了一些事情,毕竟想出了这个测试:
class Program
{
static void test(double a, double b)
{
if (a % b != a - b * Math.Truncate(a / b))
{
Console.WriteLine(a + ", " + b);
}
}
static void Main(string[] args)
{
test(2.5, 7);
test(-6.7, -3);
test(8.7, 4);
//...
}
}
Run Code Online (Sandbox Code Playgroud)
这个测试中的一切都有效.是否a % b总是等同于a - b*Math.Round(a/b)?如果没有,请向我解释这个运营商是如何运作的.
编辑:回答詹姆斯L,我明白这是一个模数运算符和一切.我很好奇它是如何使用双重的,我理解的整数.
我有以下方法:
void MyMethod(params object[] args)
{
}
Run Code Online (Sandbox Code Playgroud)
我试图用类型的参数调用object[]:
object[] myArgs = GetArgs();
MyMethod(myArgs);
Run Code Online (Sandbox Code Playgroud)
它编译很好,但在MyMethod我内部args == { myArgs},即一个数组,其中一个元素是我的原始参数.显然我想拥有args = myArgs,我做错了什么?
编辑:
Jon Skeet实际上是对的,GetArgs()确实将事物包装在一个元素数组中,对不起愚蠢的问题.
c# ×4
android ×2
.net ×1
asp.net-mvc ×1
constructor ×1
entity ×1
linq ×1
modulo ×1
params ×1
performance ×1
sql ×1
t-sql ×1
windows ×1