XNA прямая загрузка контента

В XNA (и в MonoGame) можно загружать контентна прямую

Texture2D  myTexture;
System.IO.Stream stream = TitleContainer.OpenStream("Content/picture.jpg");
myTexture = Texture2D.FromStream(GraphicsDevice, stream);

LINQ vs foreach измерение скорости работы

Я вспомнил что давно хотел прояснить для себя вопрос, насколько использование LINQ быстрее/медленнее циклов.
Оказалось, к моему сожалению что медленнее, а массивы оказались быстрее листов.
Немного вступления. Когда появился LINQ он показался мне чем-то страшным и только для работы с базами данных. Через некоторое время я полюбил его. В самом деле, писать типизированные запросы к базе данных на нам настоящее удовольствие. И так постепенно он плотно вошел в мою жизнь. Я забыл все алгоритмы сортировки и поиска и полностью стал использовать LINQ. Но никогда не задумывался, а насколько быстро он работает. И вот вечером, после прочтения статьи о том что массивы быстрее листов (я думал на оборот) я решил проверить.
Для этого быстро написал код, коллекции и массивы я решил заполнять случайными значениями, при старте приложения. Размер массивов/списков 10000000 элементов. Замеры я делал на релизном билде с отпимизацией (.net4.5).
Ну что, начнем, для начала строки:

var result = stringList.Where(w => w.Contains("ab")).ToList();

против

var result = new List<string>();
            foreach (var item in stringList)
            {
                if (item.Contains("ab"))
                {
                    result.Add(item); 
                }
            }

И что в результате?
3480 мс. против 2360 мс. 
А если в место листов используются массивы то 2542 мс. против 2122 мс.
Да, вот так, почти секунда разницы. Как вы понимаете LINQ проиграл, так же, как и листы.
Грубо говоря мы теряем 35% производительности на LINQ запросах.
На массивах мы теряем всего 15% на LINQ запросах.

Теперь числа:

var result = intList.Where(w => w > 300 && w < 1000).ToList();

против

var result = new List<int>();
            foreach (var item in intList)
            {
                if (item > 300 && item < 1000)
                {
                    result.Add(item);
                }
            }

314 мс. против 184 мс. и 188 против 165 для массивов. Ну чтож, опять LINQ проиграл. Причем разница уже в 42% для листов и 13% для массивов.
Последняя надежда остаётся FirstOrDefault() может сейчас вырваться вперед?

var result = intList.Where(w => w > 300 && w < 5000).FirstOrDefault();

против

int result = 0;
            foreach (var item in intList)
            {
                if (item > 300 && item < 5000)
                {
                    result = item;
                    break;
                }
            }

51 и 45 мс. в этот раз 22%, и  foreach опять победил.

Я запускал несколько раз приложение, и результат всегда был одинаковый от 20% до 45% процентов увеличение времени выполнения по сравнению с foreach.
Интересно, чем обусловлено такое поведение? Я думаю, что лишнее время тратиться на создания дерева выражений, и возможно какие-то еще функции.
Вот так, за красивый и хорошо читаемый код нам приходиться расплачиваться скоростью работы. С другой стороны в обычных приложениях несколько десятков миллисекунд задержки будут не критичны, но в высоконагруженных проектах это может стать большой проблемой.

 

 

WCF сервис и клиент, запуск и создание программно

Сервер:

Uri baseAddress = new Uri(string.Format("net.tcp://127.0.0.1:{0}/ MyService", port));
ServiceHost serviceHost = new ServiceHost(typeof(MyService));

serviceHost.AddServiceEndpoint(typeof(IMyService),
	new NetTcpBinding(),
	baseAddress);

serviceHost.Open();

Клиент:

var myBinding = new BasicHttpBinding();
var myEndpoint = new EndpointAddress("http://localhost/myservice");
var myChannelFactory = new ChannelFactory<IMyService>(myBinding, myEndpoint);

IMyService client = null;

try
{
    client = myChannelFactory.CreateChannel();
    client.MyServiceOperation();
    ((ICommunicationObject)client).Close();
}
catch
{
    if (client != null)
    {
        ((ICommunicationObject)client).Abort();
    }
}

Как получить доступ к private полю класса из вне

Иногда нужно получить доступ к private полям класса, а у вас нет возможности модифицировать класс.
Это можно сделать так:

static void Main(string[] args)
{
    PrivateClass myPrivateClass = new PrivateClass();
 
    // input from ToString() at the beginning to see the content
    Console.WriteLine(myPrivateClass);
 
    FieldInfo fi = typeof(PrivateClass).GetField("_privateText", BindingFlags.NonPublic | BindingFlags.Instance);
    String valueFromPrivateField = fi.GetValue(myPrivateClass).ToString();
    Console.WriteLine("And this was read with reflection: {0}", valueFromPrivateField);
}
static void Main(string[] args)
{
    PrivateClass myPrivateClass = new PrivateClass();
 
    // input from ToString() at the beginning
    Console.WriteLine(myPrivateClass);
 
    FieldInfo fi = typeof(PrivateClass).GetField("_privateText", BindingFlags.NonPublic | BindingFlags.Instance);
    fi.SetValue(myPrivateClass, "but I''m going to change you!");
    Console.WriteLine(myPrivateClass);
}



ссылка: http://nubo-corp.com/patrick-lamber/2010/07/how-do-i-access-private-methods-properties-and-member-variable-not-controlled-by-me-in-c/

Настройка Windows Service – доступ к рабочему столу

Для этого сервис должен быть запущен он локальный учетной записи, и в инсталлере нужно прописать вот так:

[RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            this.InitializeComponent();
        }

        protected override void OnCommitted(IDictionary savedState)
        {
            base.OnCommitted(savedState);

            using (RegistryKey ckey =
                Registry.LocalMachine.OpenSubKey(string.Format(@"SYSTEM\CurrentControlSet\Services\{0}", "YOURSERVICENAME"), true))
            {
                if (ckey != null && ckey.GetValue("Type") != null)
                {
                    ckey.SetValue("Type", (((int)ckey.GetValue("Type")) | 256));
                }
            }
        }
    }

Ссылка http://stackoverflow.com/questions/1945529/how-can-i-configure-my-windows-service-in-the-code-to-access-the-desktop

C# 8 способов создать поток

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (ob, se) => 
{
	//работа потока
	int a = 5;
};
bw.RunWorkerAsync();
System.Threading.Thread newThread;
newThread = new System.Threading.Thread(() => 
{
	//работа потока
	int a = 5;
});
newThread.Start();
new System.Threading.Thread(() => 
{
	//работа потока
	int a = 5;
}).Start();
ThreadPool.QueueUserWorkItem((obj) => 
{ 
	//работа потока
	int a = 5;
});
Parallel.Invoke(() => 
{ 
	//работа потока
	int a = 5;
});
Task.Run(() =>
{
	//работа потока
	int a = 5;
});
Task t1 = new Task(() => 
{
	//работа потока
	int a = 5;
});
t1.Start();
Task t2 = Task.Factory.StartNew(() => 
{
	//работа потока
	int a = 5;
});
t2.Wait();

Включить Gzip сжатие в ASP.NET и web.config

 <system.webServer>
    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
      <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
      <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="application/xml" enabled="true" />
        <add mimeType="application/atom" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/soap+xml" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
      </dynamicTypes>
      <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="application/xml" enabled="true" />
        <add mimeType="application/atom" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/soap+xml" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
      </staticTypes>
    </httpCompression>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
  </system.webServer>

Для настройки IIS  http://www.hanselman.com/blog/EnablingDynamicCompressionGzipDeflateForWCFDataFeedsODataAndOtherCustomServicesInIIS7.aspx