Отладочная информация в Windows Phone (Frame rate counter)

При разработке приложений для Windows Phone мы заметили, что при отладке с права появляться некие счетчики.
Например:

Frame Rate Counters with Labels

 

Обозначения:
Composition thread frames per second – количество кадров в секунду обновления экрана (FPS).
User interface thread frames per second – количество кадров в секунду с которой работает основной поток пользовательского интерфейса.
Texture memory usage – сколько памяти используют текстуры которые есть в вашем приложении.
Surface counter – Число поверхностей которые передаться в графический процессор для обротки.
Intermediate surface counter – количество промежуточных текстуры, созданные для композитинга.
Screen fill rate counter – представляет количество полных экранов которые перерисовал телефон за каждый кадр.
Программное включение или отключение счетчика:

Application.Current.Host.Settings.EnableFrameRateCounter = true;

или

Application.Current.Host.Settings.EnableFrameRateCounter = false;

Примерные значения счетчиков:
Счетчик                                                                Хорошее    Лучшее
Composition thread frames per second             30               60  
User interface thread frames per second           15            >15 
Screen fill rate counter                                          1.0         <=2.0

Больше информации: http://msdn.microsoft.com/en-us/library/windowsphone/develop/gg588380(v=vs.105).aspx

Как настроить Azure Cache


Для использования кеша есть 2 способа:
1. Выделить какой-то процент памяти из существующих инстанcов вашего приложения для кэша.
2. Создать Worker Role память которой будет использоваться для кэша.
В обоих случаях кэш включается в настройках Cloud проект в Visual Studio.
В первом случае вы вделаете проценты – это опция “Co-located Role”, а во втором в параметрах Cache Role – Dedicated Role.
Если у вас отдельная Cache Worker Role то она должна находиться в том же Cloud проекта что и проект который будет использовать кэш.

Также есть настройки кэша, которые касаться времени жизни.
1. None  - вы сами управляете временем жизни кэша.
2. Absolute – кэш существует указано кол-во минут. После того как время выйдет кэш удалиться.
3. Sliding Window – после обращение к кэшу время счетчик времени сбрасывается. В общем кэш живет указанное кол-во времени, если не было доступа к нему. Если доступ был то счетчик сбрасывается и отсчет начинается заново.


Настройка проекта:
1. Добавить Cache Worker Role, или выделить кэш из инстанов.
2. Добавить в проект в котором будет использоваться кэш через NuGet – Windows Azure Caсhe. Судя по документации достаточно одного инстанса. В общем у вас должны появиться следующие библиотеки:
    a. Microsoft.ApplicationServer.Caching.Client.dll
    b. Microsoft.ApplicationServer.Caching.Core.dll
    c. Microsoft.WindowsFabric.Common.dll
    d. Microsoft.WindowsFabric.Data.Common.dll
    e. Microsoft.ApplicationServer.Caching.AzureCommon.dll
    f. Microsoft.ApplicationServer.Caching.AzureClientHelper.dll

3. Прописать в Web.Config ( хотя скорее всего все пропишется автоматически).

В начале файла:

<configSections>
<section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere" />
<section name="cacheDiagnostics" type="Microsoft.ApplicationServer.Caching.AzureCommon.DiagnosticsConfigurationSection, Microsoft.ApplicationServer.Caching.AzureCommon" allowLocation="true" allowDefinition="Everywhere" />
</configSections/>

 

И где-то в конце:

<dataCacheClients>  
<dataCacheClient name="default">    
<autoDiscover isEnabled="true" identifier="[cache cluster role name]" />    
<!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />-->  
</dataCacheClient></dataCacheClients><cacheDiagnostics>  
<crashDump dumpLevel="Off" dumpStorageQuotaInMB="100" />
</cacheDiagnostics>

Где [cache cluster role name] – это имя Cache Worker Role.

Или раскомментировать сроку для использования Co-located cache.

Использование:
Создаем объект с кэшем:

DataCacheFactory cacheFactory = new DataCacheFactory();
DataCache cache = cacheFactory.GetDefaultCache();

И работаем с ним:

cache.Put("item", "value");
cache.Add("item", "value");
object result = cache.Get("Item");

 

Ссылка: http://www.windowsazure.com/en-us/develop/net/how-to-guides/cache/#add-object

 

Как получить IP клиента в WCF Service

Чтобы получить IP подключенного клиента нужно сделать:

 

OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpointProperty = 
messageProperties[RemoteEndpointMessageProperty.Name] 
as RemoteEndpointMessageProperty;
String ClientIP = endpointProperty.Address;

Как удалить проект из Team Foundation Service (TFS Service)

Чтобы удалить проект из сервиса TFS нужно вызвать командную строку Developer Command Prompt (ищите в программах, появляется вместе с установленной Visual Studio)

И выполнить команду :

TFSDeleteProject /force /collection:https://YOUR_NAME.visualstudio.com/DefaultCollection PROJECT_NAME

После этого произойдёт удаление проекта.

 

Еще хороший способ, через web панель описан тут http://stackoverflow.com/a/19430842

P.S.

 Если в имени проекта есть пробелы, то заключите имя в двойные кавычки, например - "Project Name"

Загрузка файлов большого размера в ASP.NET

для загрузки больших файлов необходимо прописать в web.config

<httpRuntime executionTimeout="3600" maxRequestLength="102400"  />

и далее:

<system.web> 
    <httpRuntime maxRequestLength="2097152"/> 
</system.web>

 

<system.webServer> 
      <security> 
          <requestFiltering> 
             <requestLimits maxAllowedContentLength="2147483648" /> 
          </requestFiltering> 
      </security> 
</system.webServer>

Обратите внимание, что maxAllowedContentLength в байтах тогда MaxRequestLength в килобайтах.

Динамическое создание переменных в C# и работы с ними.

Получение списка классов в сборке:
Тут мы получаем список классов в интересущем нас пространстве имен, можно также указать конкретный класс, или что либо еще.

String namespace = "ClassLibrary1.SomeNamspace";
var  library = (AppDomain.CurrentDomain.GetAssemblies().
Where(w => w.FullName.Contains(namespace)))

 Получение списка полей в классе:
Тип свойства можно указывать, скажем мы хотим получить публичные свойства.

Type type = library.GetType("ClassName");
PropertyInfo[] properties = 
type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (PropertyInfo property in properties)
{
string propertyName = property.Name;
}

 Создание динамической переменной:

var currentType = (from i in library.GetTypes()
where i.FullName.Contains("CurrentClassName")
select i).FirstOrDefault();
var variable = Activator.CreateInstance(currentType); //создали перменную

 Записать данные в переменную:

currentType.GetProperty("ClassPropertyName").
SetValue(variable, "Новое значение свойства", null);

 Взять данные из переменной:

string getProperty = (string)currentType.GetProperty("ClassProperyName").
GetValue(variable, null);

Бинарная сериализция и десерилазиция обьтектов C#

Сериализация:

BinaryFormatter serializer = new BinaryFormatter();
using (MemoryStream s = new MemoryStream())
{
serializer.Serialize(s, ИМЯ_ПЕРЕМЕННОЙ_ДЛЯ_СЕРИАЛИЗАЦИИ);
s.ToArray();// получили сериалзиованный массив.
}

Десириализация:

BinaryFormatter serializer = new BinaryFormatter();
using (MemoryStream s = new MemoryStream(ИМЯ_ПЕРЕМЕННОЙ_ДЛЯ_ДЕСЕРИАЛИЗАЦИИ))
{
var newVariable = serializer.Deserialize(s); //создали переменную
}

C# Func<>

Общий вид таков Func<Входящий_тип, Возвращаемый_тип>((Имя_переменной_входящего_типа)=>{ реализация });

Результат можно присваивать переменным как во втором примере, или сначала делать делегат, а потом его использовать, как в первом примере.

Параметр передаеться через Invoke.

 

Пример 1:

var buildfunc = new Func<IList<SiteStructure>, string>( 
(lst) =>
{
string str = "|";
foreach (var item in lst)
{
str += item.Name;
}
return str + "|";
});
var lCurrentTemplate = from j in lModel.Templates
select new
{
ID = j.ID,
Name = j.Name,
ClassName = j.ClassName,
LastChange = j.LastChange,
NameSection = buildfunc.Invoke(j.SiteStructures)
};

 

Пример 2:

       

int a = new Func<string,int>((str) =>
{ 
int ret = 0;
if (int.TryParse(str, out ret))
{
return ret;
}
else
{
return -1;
}
}).Invoke("3");

 

Синтаксис MVC Razor

Серверный код начинается с @ .
Если выражение в одно строку можно использовать:

@someVariable


Если в несколько строк в которых используется серверный код – тогда:

@{Int someVariable = 5;<div>@someVariable</div>}


Еще есть комплексные выражения:

@ ("Какой-то текст " + someVariable)

MVC вывод HTML кода в страницу

Для того чтобы вывести HTML код в страницу из переменной ( например из базы или т.п.) нужно использовать команду @Html.Raw()
Например:

@Html.Raw("<h1>Привет</h1>")


Или:

@{string s = "<h1>Привет</h1>"}
@Html.Raw(s)